【问题标题】:Find key in nested associative array在嵌套关联数组中查找键
【发布时间】:2014-01-02 17:30:42
【问题描述】:

前几天我问了一个与此相关的问题,我得到了答案,但它没有达到我想要的效果。这是我遍历多维关联数组,检查数组中是否存在键的方法(来自我上一个问题的答案):

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

这是我的数组结构:

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

该方法遍历第一个数组分支,但不遍历第二个。有人可以解释为什么会这样吗?看来我错过了什么。

【问题讨论】:

  • 你能把输出放在你的问题中吗?
  • 一个多维数组的例子...
  • 为什么不使用 PHP 内置的 array_key_exists 函数?
  • 我认为这个链接有更聪明的解决方案来检查数组键的存在。 stackoverflow.com/a/2948985/1202487

标签: php multidimensional-array nested associative


【解决方案1】:

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

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

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

【讨论】:

  • 谢谢你 Barmar - 今天下午晚些时候我会尝试你的建议。关于您对方法是否为静态的查询,您是对的 - 它不需要实例属性。但是,我不确定创建static 方法将如何帮助应用程序。该方法存在于我的对象中,作为改变数据结构的过程的一部分,该数据结构存在于我的每个值对象中。在这个阶段,我还没有找到这种方法的其他用途。如果还有其他必要的使它成为静态的,那么我当然应该看看。你能解释一下为什么我应该把它设为静态吗?
  • 这只是编码纯度的原因。如果方法不依赖于实例,那么将其设为静态可以清楚地说明这一点。实现中还可能有一些效率,因为它需要传递的参数更少(非静态方法接收$this 作为隐式参数)并且方法查找不必扫描虚拟表。
  • 谢谢巴尔玛。关于静态方法的提示 +1 - 值得深思。
猜你喜欢
  • 1970-01-01
  • 2013-03-09
  • 2017-12-24
  • 1970-01-01
  • 1970-01-01
  • 2019-01-19
  • 1970-01-01
  • 2016-12-10
相关资源
最近更新 更多