【问题标题】:Recursive PHP function to find the first occurrence of key in array inside multi dimensional array递归PHP函数在多维数组内的数组中查找第一次出现的键
【发布时间】:2020-05-12 17:42:55
【问题描述】:

我正在尝试递归循环遍历我的多维数组,如果数组有键,我想返回当前数组。

我试图让它尽可能简单,但这返回奇怪的类型错误让我感到困惑。

在 foreach 循环中,如果嵌套项是一个数组,则再次运行该函数,直到找到该键的出现。

挠头,谁能看到我的问题。谢谢。

<?php
/**
 * @param int|string $key
 * @param array $array
 * @return bool|array
 */
public static function multi_array_key_exists($key,$array): bool
{
    // if array key exist in this dimension
    if (array_key_exists($key,$array)) {
        // return the array
        return $array;
    } else {
        // foreach array as nested item
        foreach ($array as $nested) {
            // if the nested item is an array
            if (is_array($nested))
                // run this function again
                self::multi_array_key_exists($key,$nested);
        }
    }
    return false;
}

【问题讨论】:

  • 你应该返回递归调用给你的东西,当它不是false时。
  • 如果键存在,我将返回数组,如果它不存在,重用函数也会返回 false,我不太确定你的意思
  • 请向我们提供有关您遇到的错误和您尝试的阵列的信息。
  • 我最初重写了您的代码以返回顶级数组而不是带有键的嵌套数组(这就是答案被否决的原因)。我更正了嵌套数组的答案,但你能澄清一下应该返回哪一个吗?
  • 我已经对数组进行了评论,但仍然没有返回包含键 form 的数组

标签: php arrays


【解决方案1】:

当您进行递归调用时,您会忽略它返回的内容。您应该检查它,看看该调用是否找到匹配项。

替换:

self::multi_array_key_exists($key,$nested);

与:

$res = self::multi_array_key_exists($key,$nested);
if ($res !== false) return $res;

(不要忘记将语句括在大括号中)。

只有当所有递归调用返回false时,你才能安全地在函数体的末尾return false

一旦这样的递归调用返回匹配项,就无需在 foreach 循环中保持迭代。您可以立即退出,将相同的信息返回到父执行上下文。

另一个问题是,您声明函数返回bool,但您希望它有时返回false,有时返回一个数组(当匹配时)。所以这是行不通的。

【讨论】:

【解决方案2】:

我纠正了你的方法。现在它可以按您的意愿工作。您还需要删除返回的 bool 类型,因为它可以是数组或布尔值。

public static function multi_array_key_exists($key,$array)
{
    // if array key exist in this dimension
    if (array_key_exists($key,$array)) {
        // return the array
        return $array;
    } else {
        // foreach array as nested item
        foreach ($array as $nested) {
            // if the nested item is an array
            if (is_array($nested)) {
                // run this function again
                $value = self::multi_array_key_exists($key,$nested);
                if ($value) {
                    return $value;
                }
            }
        }
    }
    return false;
}

【讨论】:

  • 这会在匹配深度嵌套时给出错误的返回值。它会将顶级子数组作为返回值,其中发生匹配,而不是具有该属性的实际数组。
  • 感谢您指出。我认为这就是作者所需要的。我已相应地更正了我的答案。
  • 我重新阅读了这个问题,仍然怀疑作者是否愿意返回嵌套的 arra,而不是顶部的。
  • sandbox.onlinephpfunctions.com/code/… 不返回任何内容。
  • 这是应该返回的数组{"acf_fc_layout":"form","form":"5"}
猜你喜欢
  • 2019-03-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-11
  • 1970-01-01
  • 1970-01-01
  • 2017-02-26
  • 1970-01-01
  • 2019-02-20
相关资源
最近更新 更多