2015-09-05 137 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']; 
     } 
    } 
    }