8

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'を返しますが、いくつかの単純な配列で機能します。

4

4 に答える 4

13

array_key_existsは再帰的に機能しません(Matti Virkkunenがすでに指摘しているように)。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;
}
于 2010-06-01T10:34:00.433 に答える
2

array_key_existsは、multidimensionaml配列では機能しません。そうしたい場合は、次のような独自の関数を作成する必要があります。

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れます。

于 2010-06-01T10:33:55.280 に答える
2
$test_found = false;
array_walk_recursive($arr,
                     function($v, $k) use (&$test_found)
                     {
                         $test_found |= ($k == 'test');
                     });

これには、PHP5.3以降が必要です。

于 2010-06-01T10:37:05.710 に答える
0

これは別のもので、任意の次元配列で機能します

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;
}
于 2020-12-06T13:10:59.910 に答える