操纵嵌套的多维数组

时间:2011-11-14 02:45:52

标签: php multidimensional-array nested

Array
(

    [178] => Array
        (
        )

    [179] => Array
        (
            [180] => 
            [181] => 
            [182] => 
            [183] => 
        )

    [184] => Array
        (
            [185] => 
        )

    [186] => Array
        (
        )

    [189] => Array
        (
            [190] => 
        )

    [181] => Array
        (
            [191] => 
            [192] => 
        )

    [192] => Array
        (
            [194] => 
        )

)

我有一个'链表',这个PHP数组是所有节点的列表。我使用密钥存储唯一的mysql ID以供以后查找。 您会注意到第二级数组中的某些键与第一级相同。我想加入这些数组,以便较低级别以递归方式连接到较高级别。

例如,179 - > 181 - > 192 - > 194

可能有许多节点级别,而不仅仅是我在此示例中的内容。 如何以递归方式将所有节点一起添加到正确的顺序中?

UPDATED 我还有一个节点上所有端点的数组,即没有其他节点的ID。

阵 (     [0] => 178     [1] => 180     [2] => 182     [3] => 183     [4] => 185     [5] => 186     [6] => 190     [7] => 191     [8] => 194 )

1 个答案:

答案 0 :(得分:2)

我不是肯定这是你正在寻找的,我相信有更多有效的方法可以做到这一点。但是这里有一个镜头:

给出上面提到的输入示例。

此代码:

function index_nodes($nodes, &$index) {
    foreach($nodes as $key => $value) {
        if ($value) {
            $index[$key] = $value;
            index_nodes($value, $index);
        }
    }
}

function nest_list($list) {
    $index = array();
    index_nodes($list, $index);

    // Construct tree
    $build_tree = function(&$value, $key) use ($index, &$updated) {
        if(array_key_exists($key, $index)) {
            $value = $index[$key];
            $updated = true;
        }
    };

    // This needs done several times, since I can't be sure I nested things
    // in the perfect order.
    do {
        $updated = false;
        array_walk_recursive($list, $build_tree);
    } while($updated);

    return $list;
}

像这样跑:

$list2 = nest_list($list);
print_r($list2);

提供以下输出:

Array
(
    [178] => 
    [179] => Array
        (
            [180] => 
            [181] => Array
                (
                    [191] => 
                    [192] => Array
                        (
                            [194] => 
                        )
                )
            [182] => 
            [183] => 
        )
    [184] => Array
        (
            [185] => 
        )
    [186] => 
    [189] => Array
        (
            [190] => 
        )
    [181] => Array
        (
            [191] => 
            [192] => Array
                (
                    [194] => 
                )

        )
    [192] => Array
        (
            [194] => 
        )
)

再次......大量的代码,但我认为这会让你更接近目标。