Php 从多个数组中创建一个数组
我有一个包含命名空间信息的数组:Php 从多个数组中创建一个数组,php,arrays,Php,Arrays,我有一个包含命名空间信息的数组: $array = [ ['App', 'Classes', 'Auth'], ['App', 'Classes', 'Auth'], ['App', 'Classes', 'Middleware'], ['App', 'Classes', 'Phone'], ['App', 'Classes', 'Auth'], ['App', 'Mail'], ['App', 'Mail', 'Sender'],
$array = [
['App', 'Classes', 'Auth'],
['App', 'Classes', 'Auth'],
['App', 'Classes', 'Middleware'],
['App', 'Classes', 'Phone'],
['App', 'Classes', 'Auth'],
['App', 'Mail'],
['App', 'Mail', 'Sender'],
['App', 'Box'],
];
现在,我想构建一个数组或对象,以hirachic方式显示名称空间信息:
$result = [
['App' =>
['Classes' =>
[
'Auth',
'Middleware',
'Phone',
]
],
['Mail' =>
['Sender']
],
['Box'] => []
]
]
我尝试过一些递归函数,但得到的只是一个平面数组
对不起,可能要简单得多,但我是头脑风暴:-/
<?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。
现在,在内部foreach循环中,我们维护一个当前的层次结构阶段。换句话说,$curr_层次结构包含我们当前所在的级别。
当我们在内部foreach循环中循环时,如果当前阶段没有名称空间作为它的键,那么我们分配它,并通过将其作为新的当前层次结构传递,进一步深入一层。
请注意,pass-by-reference&是反映阵列整体更改所必需的,否则,它将创建一个新克隆,使最终阵列保持为空。
您还可能注意到子元素本身也是一个数组。我认为这对你目前的环境来说很好,但如果这不是你想要的,一定要让我知道。
下面是您的场景片段
$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));
.向我们展示您尝试过的递归函数。请向我们展示您尝试过的内容以及确切的结果,并解释您的推理。这可能会对您有所帮助:您根本不需要使用递归。所以这永远不会深入到四个级别?@DaFunkyAlex乐于帮助:@DaFunkyAlex您的预期输出与此答案输出不同。请确认一次。@vivek_23您的输出与OP要求的不同。Auth必须是类数组中的值,而不是索引为Auth的空数组,以此类推others@DaFunkyAlex但答案并不正确。这不是你想要的。如果数组是json_编码并发送给用户或客户端,那么我认为这很重要。
$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));