Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/283.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 从多个数组中创建一个数组_Php_Arrays - Fatal编程技术网

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));