【问题标题】:Looping a multidimensional array to output a list on uniq numbers循环多维数组以输出 uniq 数字列表
【发布时间】:2021-06-28 16:52:20
【问题描述】:

给定以下多维数组:

$menu = [
    'root' => [
        'items' => [
            'A' => [
                'p' => [1, 2, 9],
            ],
            'B' => [
                'p' => [1, 2, 3, 9],
            ],
            'C' => [
                'p' => [1, 2, 4, 9],
            ],
            'D' => [
                'items' => [
                    'D1' => [
                        'p' => [1, 2, 3, 4, 9],
                    ],
                    'D2' => [
                        'p' => [1, 2, 3, 4],
                    ],
                ],
            ],
            'E' => [
                'items' => [
                    'E1' => [
                        'p' => [1, 2, 10],
                    ],
                ],
            ],
            'F' => [
                'items' => [
                    'F1' => [
                        'p' => [5, 6],
                    ],
                    'F2' => [
                        'p' => [7, 8],
                    ],
                ],
            ],
        ],
    ],
];

有没有办法将'p's 中的所有值作为数组唯一地获取? 输出应该是[1, 2, 9, 3, 4, 10, 5, 6, 7, 8]

我尝试了一个简单的单行,但它只适用于第一级(A、B、C),嵌套的$items 被忽略:

$ps = array_unique(call_user_func_array('array_merge', array_column($menu['root']['items'], 'p')));
print_r($ps);

我也尝试写一个递归函数,但我完全卡住了,输出不是预期的

function recursive_ps($elem, $arr = []){
    $output = $arr;
    if (isset($elem['items'])){
        foreach($elem['items'] as $key => $value){
            if (isset($value['p'])){
                $output = array_merge($arr, $value['p']);
                if (isset($value['items'])){
                    return recursive_ps($value, $output);
                }
            }
        }
    }
    return $output;
}
$o = recursive_ps($menu['root']);
print_r($o);

请帮忙?

【问题讨论】:

  • 你得到的输出是什么?

标签: php arrays recursion


【解决方案1】:

主要问题是循环中的return recursive_ps。您必须将返回的数据与当前数组合并。

测试$values['items'] 的第二个if 不应位于$value[p] 内。

另外,$output = array_merge($arr, $value['p']); 应该是 $output = array_merge($output, $value['p']); 以组合到当前数组。

工作代码:(demo)

function recursive_ps($elem) 
{
    if (!isset($elem['items'])) {
        return [];
    }
    $output = [];
    foreach($elem['items'] as $key => $value) {
        if (isset($value['p'])) {
            $output = array_merge($output, $value['p']);
        }
        if (isset($value['items'])) {
            // merge the return value of function
            $output = array_merge($output, recursive_ps($value));
        }
    }
    return $output;
}

$output = array_values(array_unique(recursive_ps($menu['root'])));
print_r($output);

输出:

Array
(
    [0] => 1
    [1] => 2
    [2] => 9
    [3] => 3
    [4] => 4
    [5] => 10
    [6] => 5
    [7] => 6
    [8] => 7
    [9] => 8
)

使用参考的另一个版本:

function recursive_ps($elem, &$arr = []) {
    if (isset($elem['items'])) {
        foreach($elem['items'] as $key => $value) {
            if (isset($value['p'])) {
                $arr = array_merge($arr, $value['p']);
            }
            if (isset($value['items'])) {
                recursive_ps($value, $arr); // pass array by reference
            }
        }
    }
}

$output = [];
recursive_ps($menu['root'], $output); // pass array by reference
print_r(array_values(array_unique($output)));

【讨论】:

    猜你喜欢
    • 2017-04-07
    • 1970-01-01
    • 2016-05-30
    • 2019-11-16
    • 1970-01-01
    • 1970-01-01
    • 2020-03-06
    • 2012-04-25
    • 2018-07-30
    相关资源
    最近更新 更多