我有一个方法来检查键是否在嵌套的关联数组中:
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(这是不正确的)。
您的方法几乎可以工作了。但问题很少。
-
比较数值和字符串。在第一轮中,方法将0作为关键字,将"电子邮件"作为值。
0 == 'email'
总是返回true。 -
调用对象成员函数时应使用
$this
。 -
您应该返回递归函数的值。
你重写的方法。
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;
}