【问题标题】:Memorize recursive function value记住递归函数值
【发布时间】:2018-10-07 06:42:56
【问题描述】:

所以我有一个递归函数,它到达最后一个数组的末尾并打印它的值:

function recursive($array, $level = 1) {
        foreach($array as $key => $value){
            if(is_array($value)){
                recursive($value, $level + 1);
            } else{
                echo 'LEVEL : '. $level . " ==> " . $key . ": " . $value, '<br>';
            }
        }
}

并因此显示以下示例:

LEVEL : 2 ==> value: 10
LEVEL : 4 ==> key: A
LEVEL : 5 ==> value: 15
LEVEL : 7 ==> key: B
LEVEL : 8 ==> value: 45
LEVEL : 4 ==> key: C
LEVEL : 5 ==> value: 77
LEVEL : 7 ==> key: D
LEVEL : 8 ==> value: 18

在最新级别(在本例中为 8)的末尾,我想显示其父级的值而不是所有内容 - 例如:

LEVEL : 8 ==> value: 10, key: A, value: 15, key: B, value: 45
LEVEL : 8 ==> value: 10, key: C, value: 77, key: D, value: 18

知道 8 只是一个例子,可能还有很多。

输入数组示例:

array = array(
    array(
        "value"=>"10"
        array(
            array(
                "key"=>"A",
                array(
                    "value"=>"15",
                ),
                ... etc
            ), 
           ... etc
        ),
    ),
);

有人可以帮我完成这个算法吗?

【问题讨论】:

  • 你能告诉我们输入数组吗?
  • @Daniel1147 数组非常庞大,我写了一个简单的示例,但是您必须了解级别。每个级别基本上都是一个数组。
  • 我认为传递遍历路径作为参数会有所帮助。
  • @Daniel1147 你是什么意思?你能开发吗:)
  • 我假设如果一个数组不包含数组元素,则它是最新级别。对吗?

标签: php algorithm recursion


【解决方案1】:

我在函数递归中添加了另一个参数 $history,它告诉下一级遇到了什么。

<?php

function recursive($array, $level = 1, $history) {
    // this variable is to flag if there is an array element at current level.
    // if not, it will be latest level and output the line;
    $isLatestLevel = true;
    foreach($array as $key => $value){
        if(is_array($value)){
            recursive($value, $level + 1, $history);

            // an array element found; this is not the latest level;
            $isLatestLevel = false;
        } else{
            // create new entity to history
            $entity = $key . ": " . $value;
            $history[] = $entity;
        }
    }
    if ($isLatestLevel) {
        // output at the latest level
        // implode() means concate each history with ', ' between them
        echo "LEVEL : $level ==> " . implode(', ', $history) . PHP_EOL;
    }
}

$input = [
    'value' => '10',
    [
        [
            [
                'key' => 'A',
                [
                    'value' => '15',
                    [
                        [
                            'key' => 'B',
                            [
                                'value' => '45',
                            ]
                        ]
                    ]
                ]
            ],
            [
                'key' => 'C',
                [
                    'value' => '77',
                    [
                        [
                            'key' => 'D',
                            [
                                'value' => '18',
                            ]
                        ]
                    ]
                ]
            ]
        ],
    ],
];

recursive($input, 1, []);

【讨论】:

  • 感谢您的帮助!
猜你喜欢
  • 2015-08-09
  • 1970-01-01
  • 2023-03-28
  • 2021-12-14
  • 2018-08-11
  • 2012-11-26
  • 2014-10-31
  • 2015-02-03
  • 2020-10-11
相关资源
最近更新 更多