array_key_exists не работает

array_key_exists не работает для большого многомерного массива. Для бывшего

$arr = array(
    '1' => 10,
    '2' => array(
        '21' => 21,
        '22' => 22,
        '23' => array(
            'test' => 100,
            '231' => 231
        ),
    ),
    '3' => 30,
    '4' => 40
);

array_key_exists('test',$arr) возвращает false, но работает с некоторыми простыми массивами.


person ArK    schedule 01.06.2010    source источник
comment
Он работает именно так, как должен - в массиве $arr такого ключа нет.   -  person Matti Virkkunen    schedule 01.06.2010


Ответы (4)


array_key_exists НЕ работает рекурсивно (как уже указывал Матти Вирккунен). Посмотрите руководство по PHP, там есть следующее: фрагмент кода, который можно использовать для выполнения рекурсивного поиска:

<?php
function array_key_exists_r($needle, $haystack)
{
    $result = array_key_exists($needle, $haystack);
    if ($result) return $result;
    foreach ($haystack as $v) {
        if (is_array($v)) {
            $result = array_key_exists_r($needle, $v);
        }
        if ($result) return $result;
    }
    return $result;
}
person halfdan    schedule 01.06.2010

array_key_exists не работает с многомерными массивами. если вы хотите это сделать, вам нужно написать свою собственную функцию следующим образом:

function array_key_exists_multi($n, $arr) {
      foreach ($arr as $key=>$val) {
        if ($n===$key) {
          return $key;
        }
        if (is_array($val)) {
          if(multi_array_key_exists($n, $val)) {
            return $key . ":" . array_key_exists_multi($n, $val);
          }
        }
      }
  return false;
}

это возвращает false, если ключ не найден, или строку, содержащую «местоположение» ключа в этом массиве (например, 2:23:test), если он найден.

person oezi    schedule 01.06.2010

$test_found = false;
array_walk_recursive($arr,
                     function($v, $k) use (&$test_found)
                     {
                         $test_found |= ($k == 'test');
                     });

Для этого требуется PHP 5.3 или более поздняя версия.

person Matthew Flaschen    schedule 01.06.2010
comment
указывает на ошибку при использовании функции ($ v, $ k) (& $ test_found), а сообщение - «Ошибка синтаксического анализа: синтаксическая ошибка, неожиданная T_FUNCTION в файле.php в строке 28» - person ArK; 01.06.2010

Вот еще один, работает с любым массивом измерений

function findValByKey($arr , $keySearch){
    $out = null;
    if (is_array($arr)){
        if (array_key_exists($keySearch, $arr)){
            $out = $arr[$keySearch];
        }else{
            foreach ($arr as $key => $value){
                if ($out = self::findValByKey($value, $keySearch)){
                    break;
                }
            }
        }
    }
    return $out;
}
person Mohammad Ali Fathi    schedule 06.12.2020