【问题标题】:Merging flat array with itself to build a multidimensional array recursively将平面数组与自身合并以递归方式构建多维数组
【发布时间】:2016-01-27 10:46:23
【问题描述】:

尝试从我的平面数据中获取多维数组

可用的原始数据

此原始数据可供我使用。我需要构建一个多维数组,其中所有孩子都存储在各自的父母中。

Array
(
    [index] => Array
    (
        [slug] => index
        [parent_slug] => 
    )
    [praxis-und-team] => Array
    (
        [slug] => praxis-und-team
        [parent_slug] => 
    )
    [leistungen] => Array
    (
        [slug] => leistungen
        [parent_slug] => praxis-und-team
    )
    [partner-und-netzwerk] => Array
    (
        [slug] => partner-und-netzwerk
        [parent_slug] => 
    )
    [notfall] => Array
    (
        [slug] => notfall
        [parent_slug] => 
    )
    [impressum] => Array
    (
        [slug] => impressum
        [parent_slug] => leistungen
    )
)

需要的数据

这都是关于 slug/parent_slug 配对的。 可能有更多的子级别,所以它必须是递归的,直到到达最顶层的parent_slug == ''输出应该是这样的:

Array
(
    [index] => Array
    (
        [slug] => index
        [parent_slug] => 
    )
    [praxis-und-team] => Array
    (
        [slug] => praxis-und-team
        [parent_slug] => 
        [children] => Array
        (
            [leistungen] => Array
            (
                [slug] => leistungen
                [parent_slug] => praxis-und-team
                [children] => Array
                (
                    [impressum] => Array
                    (
                        [slug] => impressum
                        [parent_slug] => leistungen
                    )
                )
            )
        )
    )
    [partner-und-netzwerk] => Array
    (
        [slug] => partner-und-netzwerk
        [parent_slug] => 
    )
    [notfall] => Array
    (
        [slug] => notfall
        [parent_slug] => 
    )
)

非常感谢您的帮助!对不起,如果我没有解决这个问题。我已经看很久了……

【问题讨论】:

    标签: php arrays recursion multidimensional-array


    【解决方案1】:

    假设:数组中的条目是从最外到最内的。因此,我们可以恢复原始数组,一次性遍历,重构它,然后再次恢复(如果需要)。

    代码

        <?php
        $myarray = array(
            'index' => array(
                'slug' => 'index',
                'parent_slug' => '',
            ),
            'praxis-und-team' => array (
                'slug' => 'praxis-und-team',
                'parent_slug' => '',
            ),
            'leistungen' => array(
                'slug' => 'leistungen',
                'parent_slug' => 'praxis-und-team',
            ),
            'partner-und-netzwerk' => array (
                'slug' => 'partner-und-netzwerk',
                'parent_slug' => '',
            ),
            'notfall' => array(
                'slug' => 'notfall',
                'parent_slug' => '',
            ),
            'impressum' => array (
                'slug' => 'impressum',
                'parent_slug' => 'leistungen',
            ),
        );
    
        echo '<pre>'; var_dump($myarray); echo '</pre>';
    
        // We want to work from bottom to top
        $myarray = array_reverse($myarray, true);
    
        foreach($myarray as $key => $item) {
            if (!empty($myarray[$key]['parent_slug'])) {
                $myarray[$myarray[$key]['parent_slug']]['children'][$key] = $myarray[$key];
                unset($myarray[$key]);
            }
        }
    
        // Now reverse the array again.
        $myarray = array_reverse($myarray, true);
    
        echo '<pre>'; var_dump($myarray); echo '</pre>';
    
    
        ?>
    

    输出

        array(4) {
          ["index"]=>
          array(2) {
            ["slug"]=>string(5) "index"
            ["parent_slug"]=>string(0) ""
          }
          ["praxis-und-team"]=>
          array(3) {
            ["slug"]=>string(15) "praxis-und-team"
            ["parent_slug"]=>string(0) ""
            ["children"]=>
            array(1) {
              ["leistungen"]=>
              array(3) {
                ["slug"]=>string(10) "leistungen"
                ["parent_slug"]=>string(15) "praxis-und-team"
                ["children"]=>
                array(1) {
                  ["impressum"]=>
                  array(2) {
                    ["slug"]=>string(9) "impressum"
                    ["parent_slug"]=>string(10) "leistungen"
                  }
                }
              }
            }
          }
          ["partner-und-netzwerk"]=>
          array(2) {
            ["slug"]=>string(20) "partner-und-netzwerk"
            ["parent_slug"]=>string(0) ""
          }
          ["notfall"]=>
          array(2) {
            ["slug"]=>string(7) "notfall"
            ["parent_slug"]=>string(0) ""
          }
        }
    

    【讨论】:

    • 不错!谢谢!马上试试。
    【解决方案2】:

    我找到了一个solution,并根据我的数据稍微调整了一下:

    function buildTree(array &$elements, $parentId = '')
    {
        $branch = array();
        foreach($elements as &$element) {
            if ($element['parent_slug'] == $parentId) {
                $children = buildTree($elements, $element['slug']);
                if ($children)
                    $element['children'] = $children;
                $branch[$element['slug']] = $element;
                unset($element);
            }
        }
        return $branch;
    }
    

    【讨论】:

      猜你喜欢
      • 2012-11-06
      • 2014-10-31
      • 1970-01-01
      • 2022-06-24
      • 1970-01-01
      • 2012-06-12
      • 2022-06-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多