如何使用 php 将数组 #1 转换为数组 #2 结构?
第一个数组是对生物列表的数据库查询结果,每个生物都按其顺序、科、属、种进行分类。等级种是各属的子分类,属分类是各科等的子分类。
在命名空间术语中,您可以像这样阅读:
索引处的项目[ 0] ---> 半翅目.米里达科.卡纳卡米里斯
索引处的项目[ 1] ---> 半翅目.蜥蜴科.新翅目.切口
array#1 的键之间有一种父/子关系
,如下所示:- "Rank_Order"值是"Rank_Family"值的父值
- "Rank_Family"值是"Rank_Genus"值的父值
- "Rank_Genus"值是"Rank_Species"值的父值
数组#1:
Array
(
[0] => Array
(
['Rank_Order'] => 'Hemiptera'
['Rank_Family'] => 'Miridae'
['Rank_Genus'] => 'Kanakamiris'
['Rank_Species'] => ''
)
[1] => Array
(
['Rank_Order'] => 'Hemiptera'
['Rank_Family'] => 'Miridae'
['Rank_Genus'] => 'Neophloeobia'
['Rank_Species'] => 'incisa'
)
[2] => Array
(
['Rank_Order'] => 'Hemiptera'
['Rank_Family'] => 'Noridae'
['Rank_Genus'] => 'Canelbia'
['Rank_Species'] => 'Arissa'
)
)
以下数组是我需要的数组结构:数组#2:
Array(
[name] => 'Hemiptera'
[children] => Array(
[0] => Array(
[name] => 'Miridae'
[children] => Array(
[0] => Array(
[name] => 'Kanakamiris'
[children] => Array(
)
)
[1] => Array(
[name] => 'Neophloeobia'
[children] => Array(
[0] => Array(
[name] => 'incisa'
[children] => Array(
)
)
)
)
)
)
[1] => Array(
[name] => 'Noridae'
[children] => Array(
[0] => Array(
[name] => 'Canelbia'
[children] => Array(
[0] => Array(
[name] => 'Arissa'
[children] => Array(
)
)
)
)
)
)
)
)
我在堆栈溢出中看到类似的问题,尽管在我的情况下无法使用它们。 例如.php-reorder-array-to-reflect-parent-id-hierarchy
我认为这对于非常大的数组来说不会非常高效,但它适用于您的场景(这是一个示例)。
$array = ...
$levels = array('Rank_Order', 'Rank_Family', 'Rank_Genus', 'Rank_Species');
function get_children($parent, $lev, $orig, $levels){
if($lev + 1 > count($levels)){
return array();
}
$seen = array();
$children = array();
foreach($orig as $node){
if($node[$levels[$lev]] == $parent && !in_array($node[$levels[$lev+1]], $seen)){
$seen[] = $node[$levels[$lev+1]];
$children[] = get_children($node[$levels[$lev+1]], $lev+1, $orig, $levels);
}
}
return array('name' => $parent, 'children' => $children);
}
function hier($orig, $levels){
$seen = array();
$result = array();
foreach($orig as $node){
if(!in_array($node[$levels[0]], $seen)){
$seen[] = $node[$levels[0]];
$result[] = get_children($node[$levels[0]], 0, $orig, $levels);
}
}
return $result;
}
print_r($array);
print_r(hier($array, $levels));