按 comment_id == parent_id 排序多维数组
sorting multi-dimensional array by comment_id == parent_id
我有多维数组
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 还不是我的朋友:(
任何人都可以给我提示如何解决这个问题。
非常感谢
您可以分两步完成:
- 按评论 ID 索引您的条目
- 遍历每个条目并用当前条目填充父条目的
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);
这是参考资料派上用场的地方...
<?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
(
)
)
)
)
)
)
)
我有多维数组
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 还不是我的朋友:( 任何人都可以给我提示如何解决这个问题。
非常感谢
您可以分两步完成:
- 按评论 ID 索引您的条目
- 遍历每个条目并用当前条目填充父条目的
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);
这是参考资料派上用场的地方...
<?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
(
)
)
)
)
)
)
)