PHP复杂的多维数组迭代

时间:2014-03-24 14:54:52

标签: php arrays multidimensional-array

我需要遍历多维数组。但我需要做的很复杂:迭代必须按级别进行 - 在1级的第一个元素,仅在它们的2级元素之后,在3级的元素之后,等等。

如果我愿意,我可以自己写,但我需要确保我不会重新发明轮子。在PHP中是否有任何现成的实现?

更新

我应该提供什么代码?这是一个理论问题。我可以为你提供一个阵列......:

Array
(
    [lev1_1] => Array
        (
            [ID] => 3547
            [children] => Array
                (
                    [lev2_1] => Array
                        (
                            [ID] => 3550
                        )

                    [lev2_2] => Array
                        (
                            [ID] => 3551
                        )
                )
        )
    [lev1_2] => Array
        (
            [ID] => 3547
            [children] => Array
                (
                    [lev2_3] => Array
                        (
                            [ID] => 3550
                            [children] => Array
                                (
                                    [lev3_1] => Array
                                        (
                                            [ID] => 3550
                                        )

                                    [lev3_2] => Array
                                        (
                                            [ID] => 3551
                                        )
                                )
                        )

                    [lev2_4] => Array
                        (
                            [ID] => 3551
                        )
                )
        )

我需要遍历lev1_x,然后是lev2_x,然后是lev3_x

1 个答案:

答案 0 :(得分:1)

嗯,这是一种愚蠢的方式来获得水平的价值。请注意,您需要根据用途调整代码。

function array_values_by_level($array, $level = 0, &$values = null) {
    if ($values === null)
        $values = array();
    if (!isset($values[$level]))
        $values[$level] = array();
    foreach ($array as $v) {
        if (is_array($v))
            array_values_by_level($v, $level + 1, &$values);
        else
            $values[$level][] = $v;
    }

    return $values;
}

测试用例:

$big_array = array(
    '1',
    '2',
    array(
        '2.1',
        '2.2',
        array(
            '2.2.1',
            '2.2.2',
            array(
                '2.2.2.1'
            )
        ),
        '2.3',
        array(
            '2.3.1',
            array(
                '2.3.1.1',
                '2.3.1.2'
            )
        )
    )
);

foreach (array_values_by_level($big_array) as $k => $v)
    printf("[%d] %s \n", $k, implode(', ', $v));

// [0] 1, 2
// [1] 2.1, 2.2, 2.3
// [2] 2.2.1, 2.2.2, 2.3.1
// [3] 2.2.2.1, 2.3.1.1, 2.3.1.2