【问题标题】:array_key_exists is not workingarray_key_exists 不工作
【发布时间】:2010-06-01 10:27:00
【问题描述】:

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' 但它适用于一些简单的数组。

【问题讨论】:

  • 它的工作方式完全符合预期 - 数组 $arr 没有这样的键。

标签: php arrays array-key


【解决方案1】:

array_key_exists 不能递归工作(正如Matti Virkkunen 已经指出的那样)。查看 PHP 手册,您可以使用以下 piece of code 执行递归搜索:

<?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;
}

【讨论】:

    【解决方案2】:

    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)。

    【讨论】:

      【解决方案3】:
      $test_found = false;
      array_walk_recursive($arr,
                           function($v, $k) use (&$test_found)
                           {
                               $test_found |= ($k == 'test');
                           });
      

      这需要 PHP 5.3 或更高版本。

      【讨论】:

      • 表示函数($v, $k) 使用错误 (&$test_found) 并且 msg 是“解析错误:语法错误,第 28 行 file.php 中的意外 T_FUNCTION”
      【解决方案4】:

      这是另一个,适用于任何维度的数组

      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;
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-08-16
        • 2019-01-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-01-06
        • 1970-01-01
        • 2017-02-03
        相关资源
        最近更新 更多