如何 'flatten' 一个未知深度和长度的多维数组并记录它的 parent-child 关系?
How to 'flatten' a multi dimensional array of unknown depth and length AND record it's parent-child relations?
我有一个 PHP 数组,如下所示:
Array
(
[0] => Array
(
[id] => 2
[name] => Item2
[children] => Array
(
[0] => Array
(
[id] => 1
[name] => Item1
[children] => Array
(
[0] => Array
(
[id] => 5
[name] => Item5
)
)
)
[1] => Array
(
[id] => 4
[name] => Item4
)
)
)
[1] => Array
(
[id] => 3
[name] => Item3
)
)
它有未知(不可预测)的深度和长度。任何级别的任何项目 可能有也可能没有 children。它是从包含产品组的 xml 文件创建的。我想将它转换为包含三个元素数组的数组:id、name 和 parent id:
[0] => array('id' => '2', 'name' => 'Item2', 'parent' => 0),
[1] => array('id' => '1', 'name' => 'Item1', 'parent' => 2),
[2] => array('id' => '4', 'name' => 'Item4', 'parent' => 2) etc.
我该怎么做?
谢谢!
这可以通过一个递归函数来实现,该函数从数组的给定级别推送所有项目,然后为任何 children
数组调用自身:
function list_items($array, $parent = 0) {
$output = array();
foreach ($array as $arr) {
$output[] = array('id' => $arr['id'], 'name' => $arr['name'], 'parent' => $parent);
if (is_array($arr['children'] ?? NULL)) {
$output = array_merge($output, list_items($arr['children'], $arr['id']));
}
}
return $output;
}
$items = list_items($array);
输出(对于我稍微扩展的数据):
Array
(
[0] => Array
(
[id] => 2
[name] => Item2
[parent] => 0
)
[1] => Array
(
[id] => 1
[name] => Item1
[parent] => 2
)
[2] => Array
(
[id] => 5
[name] => Item5
[parent] => 1
)
[3] => Array
(
[id] => 4
[name] => Item4
[parent] => 2
)
[4] => Array
(
[id] => 3
[name] => Item3
[parent] => 0
)
)
更新
原来是数组结构不一致;当只有一个 child 时,只存储 child 值而不是单个元素数组。这可以通过检查数组以查看是否设置了 id
(Ид
) 元素来处理,如果是,则在处理之前将数组推得更深一层:
function list_items($array, $parent = 0) {
$output = array();
if (isset($array['Ид'])) {
$array = array($array);
}
foreach ($array as $arr) {
if (!is_array($arr)) echo $arr;
$output[] = array('id' => $arr['Ид'], 'name' => $arr['Наименование'], 'parent' => $parent);
if (is_array($arr['Группы']['Группа'] ?? NULL)) {
$output = array_merge($output, list_items($arr['Группы']['Группа'], $arr['Ид']));
}
}
return $output;
}
$items = list_items($array);
print_r($items);
我有一个 PHP 数组,如下所示:
Array
(
[0] => Array
(
[id] => 2
[name] => Item2
[children] => Array
(
[0] => Array
(
[id] => 1
[name] => Item1
[children] => Array
(
[0] => Array
(
[id] => 5
[name] => Item5
)
)
)
[1] => Array
(
[id] => 4
[name] => Item4
)
)
)
[1] => Array
(
[id] => 3
[name] => Item3
)
)
它有未知(不可预测)的深度和长度。任何级别的任何项目 可能有也可能没有 children。它是从包含产品组的 xml 文件创建的。我想将它转换为包含三个元素数组的数组:id、name 和 parent id:
[0] => array('id' => '2', 'name' => 'Item2', 'parent' => 0),
[1] => array('id' => '1', 'name' => 'Item1', 'parent' => 2),
[2] => array('id' => '4', 'name' => 'Item4', 'parent' => 2) etc.
我该怎么做? 谢谢!
这可以通过一个递归函数来实现,该函数从数组的给定级别推送所有项目,然后为任何 children
数组调用自身:
function list_items($array, $parent = 0) {
$output = array();
foreach ($array as $arr) {
$output[] = array('id' => $arr['id'], 'name' => $arr['name'], 'parent' => $parent);
if (is_array($arr['children'] ?? NULL)) {
$output = array_merge($output, list_items($arr['children'], $arr['id']));
}
}
return $output;
}
$items = list_items($array);
输出(对于我稍微扩展的数据):
Array
(
[0] => Array
(
[id] => 2
[name] => Item2
[parent] => 0
)
[1] => Array
(
[id] => 1
[name] => Item1
[parent] => 2
)
[2] => Array
(
[id] => 5
[name] => Item5
[parent] => 1
)
[3] => Array
(
[id] => 4
[name] => Item4
[parent] => 2
)
[4] => Array
(
[id] => 3
[name] => Item3
[parent] => 0
)
)
更新
原来是数组结构不一致;当只有一个 child 时,只存储 child 值而不是单个元素数组。这可以通过检查数组以查看是否设置了 id
(Ид
) 元素来处理,如果是,则在处理之前将数组推得更深一层:
function list_items($array, $parent = 0) {
$output = array();
if (isset($array['Ид'])) {
$array = array($array);
}
foreach ($array as $arr) {
if (!is_array($arr)) echo $arr;
$output[] = array('id' => $arr['Ид'], 'name' => $arr['Наименование'], 'parent' => $parent);
if (is_array($arr['Группы']['Группа'] ?? NULL)) {
$output = array_merge($output, list_items($arr['Группы']['Группа'], $arr['Ид']));
}
}
return $output;
}
$items = list_items($array);
print_r($items);