我有一个包含名称空间信息的数组:
$array = [
['App', 'Classes', 'Auth'],
['App', 'Classes', 'Auth'],
['App', 'Classes', 'Middleware'],
['App', 'Classes', 'Phone'],
['App', 'Classes', 'Auth'],
['App', 'Mail'],
['App', 'Mail', 'Sender'],
['App', 'Box'],
];
现在,我想构建一个单一的数组或对象,该数组或对象应该以一种多层次的方式显示名称空间信息:
$result = [
['App' =>
['Classes' =>
[
'Auth',
'Middleware',
'Phone',
]
],
['Mail' =>
['Sender']
],
['Box'] => []
]
]
我尝试了一些递归函数,但是我得到的只是一个平面数组...
private function createNamespaceHirachy( $namespaces ) {
foreach ($namespaces as $index => $namespace) {
$namespaces[$namespace] = [];
$namespaces[$namespace] = $this->createNamespaceHirachy($namespaces[$namespace]);
}
return $namespaces;
}
对不起,这可能要简单得多,但我感到很困惑:-/
答案 0 :(得分:3)
<?php
$array = [
['App', 'Classes', 'Auth'],
['App', 'Classes', 'Auth'],
['App', 'Classes', 'Middleware'],
['App', 'Classes', 'Phone'],
['App', 'Classes', 'Auth'],
['App', 'Mail'],
['App', 'Mail', 'Sender'],
['App', 'Box'],
];
$hierarchy = [];
foreach($array as $each_data){
$curr_hierarchy = &$hierarchy;
foreach($each_data as $each_namespace){
if(!isset($curr_hierarchy[$each_namespace])){
$curr_hierarchy[$each_namespace] = [];
}
$curr_hierarchy = &$curr_hierarchy[$each_namespace];
}
}
print_r($hierarchy);
$array
中的每个分层数据。$hierarchy
。$curr_hierarchy
包含我们所在的当前级别。foreach
循环中循环时,如果当前阶段没有名称空间作为其关键,则将其分配并通过将其作为新的当前层次结构传递而进一步深入。 &
来反映整个阵列的更改,否则,它将创建一个新的克隆,以使最终阵列为空。答案 1 :(得分:2)
这是您的方案的片段
$results = json_decode(json_encode($array)); // converting to object to play
$tree = null;
foreach ($results as $result) {
// checking first getting address of it to play
$thisref = &$refs->{$result[0]};
$tree->{$result[0]} = &$thisref;
// checking for level 1 if not empty
$thisref = &$refs->{$result[1]};
$tree->{$result[0]}->{$result[1]} = &$thisref;
// checking for level 2 if not empty
if (!empty($result[2])) {
$thisref = &$refs->{$result[2]};
$refs->{$result[0]}->{$result[1]}[] = $result[2];//&$thisref;
$refs->{$result[0]}->{$result[1]} = array_unique($refs->{$result[0]}->{$result[1]});
}
}
// finally converting back to array
print_r(json_decode(json_encode($tree), true));