【问题标题】:PHP nested array function with specific child array to flatten with parent items带有特定子数组的 PHP 嵌套数组函数与父项一起展平
【发布时间】:2018-01-04 04:18:19
【问题描述】:

函数/函数需要做到以下几点:

  1. 接受嵌套数组树
  2. 在我的情况下指定要展平的女巫子数组我有 ['children'] 与父项一起展平

当前树:

Array
(
    [0] => stdClass Object
    (
        [id] => 1
        [comment_threads_id] => 1
        [users_id] => 1
        [parent_id] => 0
        [message] => Lorem ipsum
        [created_at] => 2018-01-03 04:21:49
        [children] => Array
        (
            [0] => stdClass Object
            (
                [id] => 2
                [comment_threads_id] => 1
                [users_id] => 2
                [parent_id] => 1
                [message] => Lorem ipsum
                [created_at] => 2018-01-03 04:21:49
                [children] => Array
                (
                )

            )

            [1] => stdClass Object
            (
                [id] => 247
                [comment_threads_id] => 1
                [users_id] => 2
                [parent_id] => 1
                [message] => 
                [created_at] => 2018-01-03 04:30:07
                [children] => Array
                (
                )

            )

        )

    )

    [1] => stdClass Object
    (
        [id] => 3
        [comment_threads_id] => 1
        [users_id] => 1
        [parent_id] => 0
        [message] => Lorem ipsum
        [created_at] => 2018-01-03 04:21:49
        [children] => Array
        (
            [0] => stdClass Object
            (
                [id] => 4
                [comment_threads_id] => 1
                [users_id] => 2
                [parent_id] => 3
                [message] => Lorem ipsum
                [created_at] => 2018-01-03 04:21:49
                [children] => Array
                (
                    [0] => stdClass Object
                    (
                        [id] => 250
                        [comment_threads_id] => 1
                        [users_id] => 2
                        [parent_id] => 4
                        [message] => 
                        [created_at] => 2018-01-03 05:03:09
                        [children] => Array
                        (
                        )

                    )

                    [1] => stdClass Object
                    (
                        [id] => 251
                        [comment_threads_id] => 1
                        [users_id] => 2
                        [parent_id] => 4
                        [message] => 
                        [created_at] => 2018-01-03 05:25:58
                        [children] => Array
                        (
                            [0] => stdClass Object
                            (
                                [id] => 252
                                [comment_threads_id] => 1
                                [users_id] => 2
                                [parent_id] => 251
                                [message] => 
                                [created_at] => 2018-01-03 05:05:09
                                [children] => Array
                                (
                                )

                            )
                        )

                    )

                )

            )

            [1] => stdClass Object
            (
                [id] => 248
                [comment_threads_id] => 1
                [users_id] => 2
                [parent_id] => 3
                [message] => 
                [created_at] => 2018-01-03 05:02:05
                [children] => Array
                (
                )

            )

        )

    )

    [2] => stdClass Object
    (
        [id] => 5
        [comment_threads_id] => 1
        [users_id] => 2
        [parent_id] => 0
        [message] => Lorem ipsum
        [created_at] => 2018-01-03 04:21:49
        [children] => Array
        (
            [0] => stdClass Object
            (
                [id] => 6
                [comment_threads_id] => 1
                [users_id] => 2
                [parent_id] => 5
                [message] => Lorem ipsum
                [created_at] => 2018-01-03 04:21:49
                [children] => Array
                (
                    [0] => stdClass Object
                    (
                        [id] => 7
                        [comment_threads_id] => 1
                        [users_id] => 2
                        [parent_id] => 6
                        [message] => Lorem ipsum
                        [created_at] => 2018-01-03 04:21:49
                        [children] => Array
                        (
                            [0] => stdClass Object
                            (
                                [id] => 8
                                [comment_threads_id] => 1
                                [users_id] => 2
                                [parent_id] => 7
                                [message] => Lorem ipsum
                                [created_at] => 2018-01-03 04:21:49
                                [children] => Array
                                (
                                    [0] => stdClass Object
                                    (
                                        [id] => 9
                                        [comment_threads_id] => 1
                                        [users_id] => 1
                                        [parent_id] => 8
                                        [message] => Lorem ipsum
                                        [created_at] => 2018-01-03 04:21:49
                                        [children] => Array
                                        (
                                            [0] => stdClass Object
                                            (
                                                [id] => 10
                                                [comment_threads_id] => 1
                                                [users_id] => 2
                                                [parent_id] => 9
                                                [message] => Lorem ipsum
                                                [created_at] => 2018-01-03 04:21:49
                                                [children] => Array
                                                (
                                                    [0] => stdClass Object
                                                    (
                                                        [id] => 11
                                                        [comment_threads_id] => 1
                                                        [users_id] => 2
                                                        [parent_id] => 10
                                                        [message] => Lorem ipsum
                                                        [created_at] => 2018-01-03 04:21:49
                                                        [children] => Array
                                                        (
                                                            [0] => stdClass Object
                                                            (
                                                                [id] => 12
                                                                [comment_threads_id] => 1
                                                                [users_id] => 2
                                                                [parent_id] => 11
                                                                [message] => Lorem ipsum
                                                                [created_at] => 2018-01-03 04:21:49
                                                                [children] => Array
                                                                (
                                                                    [0] => stdClass Object
                                                                    (
                                                                        [id] => 13
                                                                        [comment_threads_id] => 1
                                                                        [users_id] => 2
                                                                        [parent_id] => 12
                                                                        [message] => Lorem ipsum
                                                                        [created_at] => 2018-01-03 04:21:49
                                                                        [children] => Array
                                                                        (
                                                                        )

                                                                    )

                                                                )

                                                            )

                                                        )

                                                    )

                                                )

                                            )

                                        )

                                    )

                                )

                            )

                        )

                    )

                )

            )

        )

    )

)

它应该是什么样子:

Array
(
    [0] => stdClass Object
    (
        [id] => 1
        [comment_threads_id] => 1
        [users_id] => 1
        [parent_id] => 0
        [message] => Lorem ipsum
        [created_at] => 2018-01-03 04:21:49
        [children] => Array
        (
        )

    )

    [1] => stdClass Object
    (
        [id] => 2
        [comment_threads_id] => 1
        [users_id] => 2
        [parent_id] => 1
        [message] => Lorem ipsum
        [created_at] => 2018-01-03 04:21:49
        [children] => Array
        (
        )

    )

    [2] => stdClass Object
    (
        [id] => 247
        [comment_threads_id] => 1
        [users_id] => 2
        [parent_id] => 1
        [message] => 
        [created_at] => 2018-01-03 04:30:07
        [children] => Array
        (
        )

    )

    [3] => stdClass Object
    (
        [id] => 3
        [comment_threads_id] => 1
        [users_id] => 1
        [parent_id] => 0
        [message] => Lorem ipsum
        [created_at] => 2018-01-03 04:21:49
        [children] => Array
        (
        )

    )

    [4] => stdClass Object
    (
        [id] => 4
        [comment_threads_id] => 1
        [users_id] => 2
        [parent_id] => 3
        [message] => Lorem ipsum
        [created_at] => 2018-01-03 04:21:49
        [children] => Array
        (
        )

    )

    [5] => stdClass Object
    (
        [id] => 250
        [comment_threads_id] => 1
        [users_id] => 2
        [parent_id] => 4
        [message] => 
        [created_at] => 2018-01-03 05:03:09
        [children] => Array
        (
        )

    )

    [6] => stdClass Object
    (
        [id] => 251
        [comment_threads_id] => 1
        [users_id] => 2
        [parent_id] => 4
        [message] => 
        [created_at] => 2018-01-03 05:25:58
        [children] => Array
        (           
        )

    )

    [7] => stdClass Object
    (
        [id] => 252
        [comment_threads_id] => 1
        [users_id] => 2
        [parent_id] => 251
        [message] => 
        [created_at] => 2018-01-03 05:05:09
        [children] => Array
        (
        )

    )

    [8] => stdClass Object
    (
        [id] => 248
        [comment_threads_id] => 1
        [users_id] => 2
        [parent_id] => 3
        [message] => 
        [created_at] => 2018-01-03 05:02:05
        [children] => Array
        (
        )

    )



    [9] => stdClass Object
    (
        [id] => 5
        [comment_threads_id] => 1
        [users_id] => 2
        [parent_id] => 0
        [message] => Lorem ipsum
        [created_at] => 2018-01-03 04:21:49
        [children] => Array
        (           
        )

    )

    [10] => stdClass Object
    (
        [id] => 6
        [comment_threads_id] => 1
        [users_id] => 2
        [parent_id] => 5
        [message] => Lorem ipsum
        [created_at] => 2018-01-03 04:21:49
        [children] => Array
        (
        )

    )

    [11] => stdClass Object
    (
        [id] => 7
        [comment_threads_id] => 1
        [users_id] => 2
        [parent_id] => 6
        [message] => Lorem ipsum
        [created_at] => 2018-01-03 04:21:49
        [children] => Array
        (
        )

    )

    [12] => stdClass Object
    (
        [id] => 8
        [comment_threads_id] => 1
        [users_id] => 2
        [parent_id] => 7
        [message] => Lorem ipsum
        [created_at] => 2018-01-03 04:21:49
        [children] => Array
        (
        )

    )

    [13] => stdClass Object
    (
        [id] => 9
        [comment_threads_id] => 1
        [users_id] => 1
        [parent_id] => 8
        [message] => Lorem ipsum
        [created_at] => 2018-01-03 04:21:49
        [children] => Array
        (
        )

    )

    [14] => stdClass Object
    (
        [id] => 10
        [comment_threads_id] => 1
        [users_id] => 2
        [parent_id] => 9
        [message] => Lorem ipsum
        [created_at] => 2018-01-03 04:21:49
        [children] => Array
        (
        )

    )

    [15] => stdClass Object
    (
        [id] => 11
        [comment_threads_id] => 1
        [users_id] => 2
        [parent_id] => 10
        [message] => Lorem ipsum
        [created_at] => 2018-01-03 04:21:49
        [children] => Array
        (
        )

    )

    [16] => stdClass Object
    (
        [id] => 12
        [comment_threads_id] => 1
        [users_id] => 2
        [parent_id] => 11
        [message] => Lorem ipsum
        [created_at] => 2018-01-03 04:21:49
        [children] => Array
        (
        )

    )

    [17] => stdClass Object
    (
        [id] => 13
        [comment_threads_id] => 1
        [users_id] => 2
        [parent_id] => 12
        [message] => Lorem ipsum
        [created_at] => 2018-01-03 04:21:49
        [children] => Array
        (
        )

    )

)

所以对于每个父对象我需要提取它的子数组(如果它不为空)并且对于每个子对象(如果它不为空)我需要提取它的数组等等。

在最终数组中提取时需要保持相同的ID顺序(这是目标)。

我尝试了一些类似的方法,使用一些 PHP SPL 迭代器函数和没有它们的扁平化数组,但我无法获得正确的顺序,最后数组缺少对象,到目前为止我也在寻找如果要处理 10.000 或更多的嵌套行,则性能最佳。

【问题讨论】:

    标签: php arrays multidimensional-array nested


    【解决方案1】:

    一个像这样展平对象数组的递归函数基本上需要做两件事。

    1. 对于数组中的每个对象,将其子对象分开,然后将其添加到输出数组中。
    2. 递归地展平子数组并将结果添加到输出数组。

    这是一个这样的例子。

    function flatten($input, $key) {
        $output = [];
    
        // For each object in the array
        foreach ($input as $object) {
    
            // separate its children
            $children = isset($object->$key) ? $object->$key : [];
            $object->$key = [];
    
            // and add it to the output array
            $output[] = $object;
    
            // Recursively flatten the array of children
            $children = flatten($children, $key);
    
            //  and add the result to the output array
            foreach ($children as $child) {
                $output[] = $child;
            }
        }
        return $output;
    }
    

    我不能 100% 确定您所说的“保持相同的 ID 顺序”是什么意思,但如果您的意思是我认为您应该做的事情,那么就可以做到。

    【讨论】:

    • 不需要传递要添加的数组吗?...或者追加递归的结果?
    • @Ctznkane525 $output[] = $child; 追加递归结果。
    • 错过了……我的错
    • 不用担心。这不是最有效的扁平化方法,但它确保了“相同的 ID 顺序”(如果我理解正确的话)。
    • 这是我一直在寻找的解决方案,好像我在某一时刻做错了。 ID 订单按计划进行。谢谢
    猜你喜欢
    • 1970-01-01
    • 2017-12-26
    • 1970-01-01
    • 1970-01-01
    • 2014-05-28
    • 1970-01-01
    • 2012-10-31
    • 2017-03-06
    • 2017-07-20
    相关资源
    最近更新 更多