【问题标题】:Understand and correct the Recursive Function output理解并更正递归函数输出
【发布时间】:2020-03-07 19:11:01
【问题描述】:

我有以下功能可以打印键值设置。

但它没有返回数组中的值,而是当我在 foreach 循环中使用 echo 打印它时,它显示了正确的执行。

$array = [
    '1' => true,
    ['2' => false, '4' => true],
    '3' => true    
];

$arraytrueElements = array_function($array);
echo "<pre>";
print_r($arraytrueElements);

function array_function($arr){
    $i=0;
    foreach($arr as $key => $val){
        if(is_array($val)){
             array_function($val);
        }else{
            if($val == true){
            $str[$key] = $key;
            echo "{$key}" .", \t";
        }
    }
    }
    return $str;
}

输出, 1、4、3,

Array
(
    [1] => 1
    [3] => 3
)

预期输出,

输出, 1、4、3,

Array
(
    [1] => 1,
    [4] => 4,
    [3] => 3
)

当我将这行代码修改为这个时,$str[$key] = array_function($val);

然后我有一个包含所有值的数组,但是如果已经在 echo 中显示并在 $str 数组中分配,为什么要添加它。 有点像这样作为数组内部的数组元素,而不是预期的数组输出。

Array
(
    [1] => 1
    [2] => Array
        (
            [4] => 4
        )
    [3] => 3
)

【问题讨论】:

  • 这还不清楚。请准确说明你想要得到什么,给出什么样的输入,并举例说明。是否要递归抓取值恰好为true 的所有数组键?
  • 是的,你是对的

标签: php arrays recursion


【解决方案1】:

您可能正在寻找array_merge

function array_function($arr) {
    foreach($arr as $key => $val) {
        if ( is_array($val) ) {
             $result = array_merge($result, array_function($val));
        } elseif ( $val === true ) {
            $result[$key] = $key;
        }
    }
    return $result;
}

另一种方法是将您的函数编写为一个引用结果数组的过程:

function array_function($arr, &$result) {
    foreach($arr as $key => $val) {
        if ( is_array($val) ) {
             array_function($val, $result);
        } elseif ( $val === true ) {
            $result[$key] = $key;
        }
    }
}

$result = [];
array_function($arr, $result);

print_r($result);

【讨论】:

    【解决方案2】:

    您可以简单地使用array_walk_recursive 循环每个值/键对并仅保留所需的键:

    $matches = [];
    array_walk_recursive($array, function ($value, $key) use (&$matches) {
      if ($value === true) {
        $matches[] = $key;
      }
    });
    
    print_r($matches);  // [1, 4, 3]
    

    演示:https://3v4l.org/Ksq4F

    【讨论】:

    • Jeto,我不想在递归的内置功能中使用。
    【解决方案3】:

    如果您不能/不会使用诸如array_walk_recursivearray_merge 之类的库函数,则可以改用以下代码:

    function findKeysWithTrueValues(array $array): array
    {
      $matches = [];
      foreach ($array as $key => $value) {
        if (is_array($value)) {
          foreach (findKeysWithTrueValues($value) as $match) {
            $matches[] = $match;
          }
        } elseif ($value === true) {
          $matches[] = $key;
        }
      }
      return $matches;
    }
    

    这会为数组中的每组键构建一个$matches 数组。如果该值是一个数组,它会通过递归调用遍历自己的匹配项并添加每个匹配项。否则,它只是添加密钥。

    演示:https://3v4l.org/42tX2

    【讨论】:

    • 嗨 Jeto,输出是正确的,我很感激,但是我们再次使用 array_merge 的内置函数,因为我正在学习或练习 php 基础知识,想避免它。我可以为 array_merge 编写自定义函数,但可以编写任何替代或任何技巧逻辑。
    • @Sam 我刚刚编辑了我的答案,请查看。现在不使用array_merge。另外请编辑您的开场问题,并更清楚地表明您不想要任何使用这些内置函数的解决方案。
    猜你喜欢
    • 1970-01-01
    • 2018-05-31
    • 2015-03-23
    • 1970-01-01
    • 1970-01-01
    • 2021-02-12
    • 1970-01-01
    • 1970-01-01
    • 2013-10-05
    相关资源
    最近更新 更多