通过comment_id == parent_id对多维数组进行排序

时间:2021-04-02 15:27:14

标签: php arrays loops multidimensional-array anonymous-function

我有多维数组

Array
(
    [0] => Array
        (
            [comment_id] => 32
            [article_id] => 5
            [parent_id] => 31
            [user_id] => 22
            [content] => dolor sit amet consectetur adipisicing 
            [created_at] => 02-04-2021
        )

    [1] => Array
        (
            [comment_id] => 30
            [article_id] => 5
            [parent_id] => 29
            [user_id] => 22
            [content] => Lorem ipsum dolor sit amet.
            [created_at] => 01-04-2021
        )

    [2] => Array
        (
            [comment_id] => 31
            [article_id] => 5
            [parent_id] => 29
            [user_id] => 22
            [content] => Sit amet consectetur adipisicing 
            [created_at] => 02-04-2021
        )

    [3] => Array
        (
            [comment_id] => 29
            [article_id] => 5
            [parent_id] => 0
            [user_id] => 22
            [content] => dolor sit amet consectetur adipisicing 
            [created_at] => 01-04-2021
        )

)

我试着得到

Array
(
    [comment_id] => 29
    [article_id] => 5
    [parent_id] => 0
    [user_id] => 22
    [content] => dolor sit amet consectetur adipisicing 
    [created_at] => 01-04-2021
    [comments] => Array
        (
            [0] => Array
                (
                    [comment_id] => 31
                    [article_id] => 5
                    [parent_id] => 29
                    [user_id] => 22
                    [content] => Sit amet consectetur adipisicing 
                    [created_at] => 02-04-2021
                    [comments] => Array
                        (
                            [comment_id] => 32
                            [article_id] => 5
                            [parent_id] => 31
                            [user_id] => 22
                            [content] => dolor sit amet consectetur adipisicing 
                            [created_at] => 02-04-2021
                        )

                )

            [1] => Array
                (
                    [comment_id] => 30
                    [article_id] => 5
                    [parent_id] => 29
                    [user_id] => 22
                    [content] => Lorem ipsum dolor sit amet.
                    [created_at] => 01-04-2021
                )

        )

)

基于[parent_id] == [comment_id]

我确实尝试了一些 if 语句的 foreach 循环,但我不知道多维数组将来会有多深。和匿名 fc 还不是我的朋友 :( 任何人都可以给我提示如何解决这个问题。

非常感谢

2 个答案:

答案 0 :(得分:0)

您可以分两步完成:

  1. 按评论 ID 索引您的条目
  2. 循环遍历每个条目并使用当前条目填充父条目的 comments,同时确保记住哪个是树的根。

代码:

$arr_by_comment_id = array_column($arr, null, 'comment_id');

$root_entry = null;
foreach ($arr_by_comment_id as &$entry) {
    if ($entry['parent_id'] === 0) {
        $root_entry =& $entry;
    } elseif (array_key_exists($entry['parent_id'], $arr_by_comment_id)) {
        $arr_by_comment_id[$entry['parent_id']]['comments'][] = $entry;
    }
}
unset($entry);  // For safety (since references were used)

print_r($root_entry);

Demo

答案 1 :(得分:0)

这是参考资料派上用场的地方...

<?php
$input = [
    [
        'comment_id' => 32,
        'article_id' => 5,
        'parent_id' => 31,
        'user_id' => 22,
        'content' => "dolor sit amet consectetur adipisicing", 
        'created_at' => "02-04-2021"
    ],
    [
        'comment_id' => 30,
        'article_id' => 5,
        'parent_id' => 29,
        'user_id' => 22,
        'content' => "Lorem ipsum dolor sit amet.",
        'created_at' => "01-04-2021"
    ],
    [
        'comment_id' => 31,
        'article_id' => 5,
        'parent_id' => 29,
        'user_id' => 22,
        'content' => "Sit amet consectetur adipisicing",
        'created_at' => "02-04-2021"
    ],
    [
        'comment_id' => 29,
        'article_id' => 5,
        'parent_id' => 0,
        'user_id' => 22,
        'content' => "dolor sit amet consectetur adipisicing",
        'created_at' => "01-04-2021"
    ]
];

$references = [];
foreach ($input as &$entry) {
    $entry['comments'] = [];
    $references[$entry['comment_id']] = &$entry;
} 

$output = [];
array_walk($references, function(&$entry) use ($references, &$output) {
    if ($entry['parent_id'] != 0) {
        $references[$entry['parent_id']]['comments'][] = &$entry;
    } else {
        $output[] = &$entry;
    }
});

print_r($output);

输出显然是:

Array
(
    [0] => Array
        (
            [comment_id] => 29
            [article_id] => 5
            [parent_id] => 0
            [user_id] => 22
            [content] => dolor sit amet consectetur adipisicing
            [created_at] => 01-04-2021
            [comments] => Array
                (
                    [0] => Array
                        (
                            [comment_id] => 30
                            [article_id] => 5
                            [parent_id] => 29
                            [user_id] => 22
                            [content] => Lorem ipsum dolor sit amet.
                            [created_at] => 01-04-2021
                            [comments] => Array
                                (
                                )
                        )
                    [1] => Array
                        (
                            [comment_id] => 31
                            [article_id] => 5
                            [parent_id] => 29
                            [user_id] => 22
                            [content] => Sit amet consectetur adipisicing
                            [created_at] => 02-04-2021
                            [comments] => Array
                                (
                                    [0] => Array
                                        (
                                            [comment_id] => 32
                                            [article_id] => 5
                                            [parent_id] => 31
                                            [user_id] => 22
                                            [content] => dolor sit amet consectetur adipisicing
                                            [created_at] => 02-04-2021
                                            [comments] => Array
                                                (
                                                )
                                        )
                                )
                        )
                )
        )
)