从多个数组中创建一个数组

时间:2019-05-27 12:32:28

标签: php arrays

我有一个包含名称空间信息的数组:

$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;
}

对不起,这可能要简单得多,但我感到很困惑:-/

2 个答案:

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

演示: https://3v4l.org/AVVZI

  • 我们逐一遍历$array中的每个分层数据。
  • 在上面的代码中,我们将最终的最终数组初始化为$hierarchy
  • 现在,在内部foreach循环中,我们维护一个当前的层次结构阶段。换句话说,$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));

Working demo