PHP - Получить ключ от другого значения ключа через многомерный массив

1

У меня есть следующий многомерный массив, который получается через 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.

  • 3
    Похоже, что вы используете версию PHP ниже 5.5 - В этом случае вы можете проверить эту реализацию github.com/ramsey/array_column/blob/master/src/array_column.php, если вы хотите избежать фатальной ошибки PHP
  • 0
    мой ответ работает? если так, дайте мне знать :)
Теги:
arrays

5 ответов

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 . Может потребоваться добавить только получение идентификатора (не весь набор данных).
  • 0
    это будет работать, но может потратить время после того, как ключ будет найден - это проверит каждую запись в массиве и продолжит работу после того, как ключ будет найден: o до тех пор, пока список не будет исчерпан.
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;
}
1
foreach($exchangeID as $key=>$value)
    {
        if($exchangeID[$key]['currency']=='USD'){
            $usdId=$exchangeID[$key]['id'];
      break;
        }
    }
//echo $usdId; 
//Result:ikjh
  • 0
    Минус за использование эха.
  • 0
    добавление перерыва; сделает это быстрее - текущий код продолжает искать, пока список не будет исчерпан, в то время как он должен остановиться как можно скорее, когда ключ будет найден
Показать ещё 1 комментарий
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'];
       }
    }
  }
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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню