PHP:在嵌套的关联数组中查找关键字


PHP: find key in nested associtive array

我有一个方法来检查键是否在嵌套的关联数组中:

private function checkKeyIsInArray($dataItemName, $array) {      
    foreach ($array as $key=>$value) {
        if ($key == $dataItemName) return true;
        if (is_array($value)) {
            checkKeyIsInArray($dataItemName, $value);
        }
    }
    return false;
}

它总是返回true,不管我包含或不包含哪些键。这是我的测试阵列:

Array
(
[0] => Array ( [reset_time] => 2013-12-11 22:24:25 )
[1] => Array ( [email] => someone@example.com )
)

拜托,我做错了什么?如果我搜索"reset_time",该方法将返回true(正如我所期望的);当我搜索"reset_expired"时,该方法也会返回true(这是不正确的)。

您的方法几乎可以工作了。但问题很少。

  1. 比较数值和字符串。在第一轮中,方法将0作为关键字,将"电子邮件"作为值。0 == 'email'总是返回true。

  2. 调用对象成员函数时应使用$this

  3. 您应该返回递归函数的值。

你重写的方法。

class check
    {
    private function checkKeyIsInArray($dataItemName, $array)
        {
        foreach ($array as $key => $value)
            {
            // convert $key to string to prevent key type convertion
            if ((string) $key == $dataItemName)
                return true;
            if (is_array($value))
            // $this added
            // return added
                return $this->checkKeyIsInArray($dataItemName, $value);
            }
        return false;
        }
    public function myCheck($dataItemName, $array)
        {
        return $this->checkKeyIsInArray($dataItemName, $array);
        }
    }
$check = new check();
$array = array(array('reset_time' => 123, 'email' => 123));
var_dump($check->myCheck('reset_time', $array)); // true
var_dump($check->myCheck('reset_expired', $array)); // false
var_dump($check->myCheck('0', $array)); // true

我已经更新了您自己的代码,出现了一些小问题。请检查。

function checkKeyIsInArray($dataItemName, $array) {      
   foreach ($array as $key=>$value) {
    ## here $key is int and $dataItemName is string so its alway comes true in ur case
    if ("$key" == $dataItemName) {
         return true;
    }
    else if (is_array($value)) {
        $returnvalue=checkKeyIsInArray($dataItemName, $value);
        ## once a matching key found  stop further recursive call
        if($returnvalue==true){
          return true;
        }
    }
  }
   return false;
}