【问题标题】:Create an array out of several arrays从几个数组中创建一个数组
【发布时间】:2019-05-27 12:32:28
【问题描述】:

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

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

抱歉,这可能要简单得多,但我脑子坏了:-/

【问题讨论】:

  • 向我们展示您尝试过的递归函数。
  • 向我们展示您的尝试(以及确切的结果),并解释您的推理。
  • 这可能会对您有所帮助:stackoverflow.com/questions/56135624/…
  • 你根本不需要使用递归。
  • 所以这永远不能深入四层?

标签: php arrays


【解决方案1】:
<?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 循环内循环时,如果当前阶段没有命名空间作为键,我们将其分配并通过将其作为新的当前层次结构传递更深一层。
  • 请注意,通过引用传递 &amp; 是反映整个数组更改所必需的,否则,它会创建一个新的克隆,使您的最终数组为空。
  • 您可能还会注意到子元素本身也是一个数组。我认为这对您当前的情况来说很好,但如果这不是您想要的,请告诉我。

【讨论】:

  • @DaFunkyAlex 乐于助人:)
  • @DaFunkyAlex 您的预期输出与此答案输出不同。请确认一次。
  • @vivek_23 您的输出与 OP 要求的不同。Auth 必须是 classes 数组中的一个值,而不是索引为 auth 的空数组,以此类推
  • @DaFunkyAlex 但答案不正确。这不是你要求的。
  • 如果数组将被 json_encoded 并发送给用户或客户端,那么我认为这很重要。
【解决方案2】:

这里是你的场景的 sn-p

$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.

【讨论】:

    猜你喜欢
    • 2017-08-20
    • 2012-12-16
    • 2017-05-06
    • 2013-08-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-07
    • 2023-03-19
    相关资源
    最近更新 更多