У меня есть следующий многомерный массив, который получается через API.
$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',
),
);
Я хотел бы получить идентификатор доллара США, который является lkjh. Я знаю, что это можно получить, просто сделав $ exchangeID [2] ['id']. Проблема в том, что массив динамический. Например, когда он загружен, первым подмассивом может быть EUR вместо GBP, а третьим подмассивом может быть KRN вместо доллара США.
В принципе, я имею в виду поиск подмассива, где сначала есть валюта, затем, соответственно, найдите соответствующий идентификатор. Например, если я хочу найти EUR. Сначала я нахожу EUR, а затем получаю "mnbv".
Я попробовал этот $key = array_search('USD', array_column($exchangeID, 'currency'));
но я получил следующую ошибку в ошибке error_log PHP Fatal error: Call to undefined function array_column()
чтобы получить хотя бы номер массива, например, в этом случае 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);
array_filter
+ current
. Может потребоваться добавить только получение идентификатора (не весь набор данных).
Попробуй это:
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;
}
foreach($exchangeID as $key=>$value)
{
if($exchangeID[$key]['currency']=='USD'){
$usdId=$exchangeID[$key]['id'];
break;
}
}
//echo $usdId;
//Result:ikjh
Попробуйте это, если это работает:
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'];
}
}
}
<?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