Php 在嵌套关联数组中查找键

Php 在嵌套关联数组中查找键,php,multidimensional-array,nested,associative,Php,Multidimensional Array,Nested,Associative,前几天我问了一个与此相关的问题,我得到了一个答案,但它没有达到我想要的效果。下面是我用来遍历多维关联数组的方法,根据我对上一个问题的回答,检查数组中是否有键: private function checkKeyIsInArray($dataItemName, $array) { foreach ($array as $key => $value) { // convert $key to string to prevent key type converti

前几天我问了一个与此相关的问题,我得到了一个答案,但它没有达到我想要的效果。下面是我用来遍历多维关联数组的方法,根据我对上一个问题的回答,检查数组中是否有键:

private function checkKeyIsInArray($dataItemName, $array)
{
    foreach ($array as $key => $value)
    {
        // convert $key to string to prevent key type convertion
        echo '<pre>The key: '.(string) $key.'</pre>';

        if ((string)$key == $dataItemName)
            return true;

        if (is_array($value))
            return $this->checkKeyIsInArray($dataItemName, $value);

    }
    return false;
}

该方法遍历第一个数组分支,但不遍历第二个。有人能解释一下为什么会这样吗?似乎我遗漏了什么。

问题是,无论递归调用返回什么,不管它成功还是失败,都会返回。只有在递归过程中找到密钥时才应该返回,否则应该继续循环


顺便问一下,为什么这是一个非静态函数?它似乎不需要任何实例属性。

问题在于,无论递归调用返回什么,不管它成功还是失败,都会返回。只有在递归过程中找到密钥时才应该返回,否则应该继续循环


顺便问一下,为什么这是一个非静态函数?它似乎不需要任何实例属性。

您可以显示并将输出放入您的问题中吗?一个多维数组的示例…为什么不使用内置于PHP函数的array\u key\u exists?我认为此链接有更智能的解决方案来检查数组键的存在。你能展示一下你的问题中的输出吗?一个多维数组的例子…你为什么不使用array\u key\u exists内置的PHP函数?我认为这个链接有更聪明的解决方案来检查数组键的存在。谢谢你,巴尔马-今天下午晚些时候我会试试你的建议。关于方法是否为静态的问题,您是对的,它不需要实例属性。但是,我不确定如何使该方法成为静态将有助于应用程序。该方法存在于我的对象中,作为数据结构变化过程的一部分,数据结构存在于我的每个值对象中。在这个阶段,我还没有发现这种方法的另一个用途。如果有其他必要使它保持静态,那么我当然应该考虑一下。你能解释一下我为什么要把它设为静态的吗?这只是一个原因。如果一个方法不依赖于该实例,那么将其设置为静态可以清楚地说明这一点。在实现中可能也有一些效率,因为非静态方法接收$this作为隐式参数传递的参数少了一个,并且方法查找不必扫描虚拟表。谢谢Barmar+关于静态方法的提示-值得思考。谢谢Barmar-今天下午晚些时候我会尝试你的建议。关于方法是否为静态的问题,您是对的,它不需要实例属性。但是,我不确定如何使该方法成为静态将有助于应用程序。该方法存在于我的对象中,作为数据结构变化过程的一部分,数据结构存在于我的每个值对象中。在这个阶段,我还没有发现这种方法的另一个用途。如果有其他必要使它保持静态,那么我当然应该考虑一下。你能解释一下我为什么要把它设为静态的吗?这只是一个原因。如果一个方法不依赖于该实例,那么将其设置为静态可以清楚地说明这一点。在实现中可能也有一些效率,因为非静态方法接收$this作为隐式参数传递的参数少了一个,并且方法查找不必扫描虚拟表。谢谢Barmar+1对于静态方法的提示-思考的食物。
Array (
    [0] => Array ( [reset_time] => 2013-12-11 22:24:25 )
    [1] => Array ( [email] => someone@example.com )
)
private function checkKeyIsInArray($dataItemName, $array)
{
    foreach ($array as $key => $value)
        {
            // convert $key to string to prevent key type convertion
            echo '<pre>The key: '.(string) $key.'</pre>';

            if ((string)$key == $dataItemName)
                return true;

            if (is_array($value) && $this->checkKeyIsInArray($dataItemName, $value))
                return true;

        }
    return false;
}