首页 > 解决方案 > 特殊数组中的PHP foreach

问题描述

我需要一些帮助来遍历一个嵌套数组中的所有值。我需要将 ID 恢复到数组中,并从父数组中恢复 ID。第一级必须是 parent_id = 0,订单是父数组中的 id。

Array
(
    [0] => Array
        (
        [id] => 3
        [children] => Array
            (
                [0] => Array
                    (
                        [id] => 13
                    )

                [1] => Array
                    (
                        [id] => 48
                        [children] => Array
                            (
                                [0] => Array
                                    (
                                        [id] => 52
                                    )

                                [1] => Array
                                    (
                                        [id] => 61
                                    )

                            )

                    )

            )

    )

[1] => Array
    (
        [id] => 10
        [children] => Array
            (
                [0] => Array
                    (
                        [id] => 54
                        [children] => Array
                            (
                                [0] => Array
                                    (
                                        [id] => 55
                                        [children] => Array
                                            (
                                                [0] => Array
                                                    (
                                                        [id] => 56
                                                    )

                                            )

                                    )

                            )

                    )

            )

    )

)

我正在使用以下 PHP 脚本来恢复数据:

function readClass($k, $v, &$parent_id, &$new_id, &$order_id ) {

    $out = "";

    if (!is_array($v)) {

        $out .= "<li>id:$v | parent_id:$parent_id | order:$order_id ";

        if (($parent_id == "0") || ($new_id == "S")) { 
            $parent_id = $v; 
            $new_id = 'N';
        }

    } else {

        foreach($v as $k2=>$v2) {
            $order_id++;
            $out .= readClass($k2, $v2, $parent_id, $new_id, $order_id);
        }
    }

    return $out;    
}   


foreach($someArray as $key=>$value) {
    $parent_id = '0';
    $order_id = '0';
    $new_id = 'N';
    echo readClass($key, $value, $parent_id, $new_id, $order_id );
}

结果是:

id:3 | parent_id:0 | order:1 
id:13 | parent_id:3 | order:4 
id:48 | parent_id:3 | order:6   
id:52 | parent_id:3 | order:9
id:61 | parent_id:3 | order:11
id:10 | parent_id:0 | order:1
id:54 | parent_id:10 | order:4
id:55 | parent_id:10 | order:7
id:56 | parent_id:10 | order:10

我想像这样恢复:

id:3 | parent_id:0 | order:1 
id:13 | parent_id:3 | order:4 
id:48 | parent_id:3 | order:6   
id:52 | parent_id:48 | order:9
id:61 | parent_id:48 | order:11
id:10 | parent_id:0 | order:1
id:54 | parent_id:10 | order:4
id:55 | parent_id:54 | order:7
id:56 | parent_id:55 | order:10

注意 parent_id 与 id (52,61,55,56) 的区别。是问题...

有任何想法吗?

标签: php

解决方案


我做的事情有点不同。我不知道 new_id 的目的是什么,但我认为您的代码中没有使用它。

您正在迭代数组中的每个项目,而不是了解结构并解决它。

下面的代码片段只是迭代每个项目,只要它有孩子就继续向下,更新 parentId。

function readClass($arr,$parentId = 0,&$order = 0){
    echo $arr['id'] . ', ' . $parentId . ', ' . $order . "\n";
    if(isset($arr['children'])){
        foreach($arr['children'] as $child){
            $order++;
            readClass($child,$arr['id'],$order);
        }
    }
}

不过,订单不会和你的一样。


推荐阅读