PHP foreach特殊数组

时间:2019-02-08 19:26:15

标签: php

我需要一些帮助来遍历一个嵌套数组中的所有值。我需要将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)的区别。是问题所在...

有什么想法吗?

3 个答案:

答案 0 :(得分:0)

我做的事情有些不同。我不知道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);
        }
    }
}

但是订单不会与您的订单相同。

答案 1 :(得分:0)

由于您不使用第一个参数,因此我将其删除并重新组织了很多代码。想法是您从元素获取并输出当前项目。然后,如果子元素中包含元素,则将此ID传递给递归调用并处理每个子元素...

function readClass( $v, $parent_id, &$new_id, &$order_id ) {
    $out = "";
    $order_id++;
    $out .= "<li>id:$v[id] | parent_id:$parent_id | order:$order_id ";
    if ( isset($v["children"]) )  {
        $parent_id = $v["id"];
        foreach ( $v["children"] as $children ) {
            $out .= readClass( $children, $parent_id, $new_id, $order_id);
        }
    }

    return $out;
}

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

我已经尝试使用您的数据子集对此进行测试,并且似乎可以生成该数据,但是您必须进行检查并让我知道是否存在特定错误。

答案 2 :(得分:0)

我看到了以下问题:您从未发送过新的$parent_id。因此,我对readClass函数进行了更改:

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 {
        $old_value2 = 0;
        foreach($v as $k2=>$v2) {
            if($k2 === "children")  // -- If the current index is children(They will need a new father)
                $parent_id = $old_value2;
            $order_id++;
            $out .= readClass($k2, $v2, $parent_id, $new_id, $order_id);
            $old_value2 = $v2; // -- We always set the old one as the new father in case he has childrens 
        }
    }

    return $out;
}