2015-09-05 136 views
1

我有以下通过API获取的多维数组。PHP - 通过多维数组获取其他键值的密钥

$exchangeID = array(
    0 => array(
     'id' => 'vcxz', 
     'currency' => 'GBP', 
     ), 
    1 => array(
     'id' => 'mnbv', 
     'currency' => 'EUR', 
     ), 
    2 => array(
     'id' => 'lkjh', 
     'currency' => 'USD', 
     ), 
    3 => array(
     'id' => 'poiuy', 
     'currency' => 'KRN', 
     ), 
    ); 

我想获得ID USD这是lkjh。我知道这可以通过简单地做$ exchangeID [2] ['id']来获得。问题是数组是动态的。例如,当它被加载时,第一个子数组可能是EUR而不是GBP,第三个子数组可能是KRN而不是USD。

基本上,我脑子里想找的是先找到货币的子数组,然后找到相应的id。例如。如果我想找到欧元。首先我找到EUR,然后获得'mnbv'。

我试过这个$key = array_search('USD', array_column($exchangeID, 'currency'));,但我在error_log PHP Fatal error: Call to undefined function array_column()中得到了以下错误,至少得到了数组编号,例如在这种情况下,2

+3

看来你使用的是PHP版本低于5.5 - 在这种情况下,如果您想避免PHP致命错误,您可以检查此实现https://github.com/ramsey/array_column/blob/master/src/array_column.php – maxdangelo

+0

我的答案有用吗?如果是这样,请让我知道:) – aimme

回答

1
foreach($exchangeID as $key=>$value) 
    { 
     if($exchangeID[$key]['currency']=='USD'){ 
      $usdId=$exchangeID[$key]['id']; 
     break; 
     } 
    } 
//echo $usdId; 
//Result:ikjh 
+0

减去使用回声。 –

+0

加入休息;将使其更快 - 当前代码一直查找,直到列表耗尽,而_should_在发现密钥时尽快停止 – hanshenrik

+0

删除了回显,添加了break.happy?呵呵:-) – aimme

1

试试这个:

foreach ($exchangeID as $key => $arr) 
    if($arr['currency'] == 'USD') 
    echo $key; 

它可以使用下面的自定义函数来获取键:

echo getKeyRecursive('USD', $exchangeID); 
function getKeyRecursive($needle, $haystack, $strict = false) 
{ 
    foreach ($haystack as $key => $item){ 
    if(($strict ? $item === $needle : $item == $needle) || (is_array($item) && getKeyRecursive($needle, $item, $strict))) return $key; 
    } 
    return false; 
} 
2

你可以简单地过滤你的阵列,像这个:

$usd_exchanges = array_filter($exchangeID, function($row) { 
    return $row['currency'] == "USD"; 
})); 
var_dump($usd_exchanges[0]); 

你也可以返回过滤器的第一个元素,使用current方法:

$usd_exchange = current(array_filter($exchangeID, function($row) { 
    return $row['currency'] == "USD"; 
}))); 
var_dump($usd_exchange); 
+0

加'array_filter' +'current'。可能只想添加获取id(而不是整个数据集)。 –

+0

这会起作用,但在找到密钥后可能会浪费时间 - 这将检查数组中的每个记录,并在找到密钥后继续:o直到列表用尽 – hanshenrik

0
<?php 
$exchangeID = array(
    0 => array(
     'id' => 'vcxz', 
     'currency' => 'GBP', 
     ), 
    1 => array(
     'id' => 'mnbv', 
     'currency' => 'EUR', 
     ), 
    2 => array(
     'id' => 'lkjh', 
     'currency' => 'USD', 
     ), 
    3 => array(
     'id' => 'poiuy', 
     'currency' => 'KRN', 
     ), 
    ); 
$db=new PDO('sqlite::memory:','','',array(PDO::ATTR_EMULATE_PREPARES => false, PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION)); 
$db->query('CREATE TABLE `troll` (`dbid` TEXT, `dbcurrency` TEXT);'); 
$stm=$db->prepare("INSERT INTO `troll` (`dbid`,`dbcurrency`) VALUES(:id,:currency);"); 
array_walk($exchangeID,function($arr)use($stm){$stm->execute($arr);}); 
$res=$db->query("SELECT `dbid` AS `id` FROM `troll` WHERE `dbcurrency` = ".$db->quote('USD').' LIMIT 1'); 

$id=$res->fetch(PDO::FETCH_ASSOC); 
$id=$id['id']; 
var_dump($id); 

看到工作示例这里http://codepad.viper-7.com/1lg2Gj

0

试试这个,如果这个工程:

foreach($exchangeID as $key => $val) 
    { 
     if(array_key_exists('currency', $val)) 
     if($val['currency'] == 'USD'){ 
      echo $val['id']; 
      echo $val['currency']; 
     elseif($val['currency'] == 'GBP'){a1 
      echo $val['id']; 
      echo $val['currency']); 
     elseif($val['currency'] == 'EUR'){ 
      echo $val['id']; 
     echo $val['currency']; 
     }else{ 
      echo $val['id']; 
     echo $val['currency']; 
     } 
    } 
    }