【问题标题】:PHP > Form a multi-dimensional array from a nested set model flat arrayPHP > 从嵌套集合模型平面数组形成多维数组
【发布时间】:2009-10-22 12:13:16
【问题描述】:

好的,基本上,我已经形成了一个 mySQL 查询,它返回一个完全按照我的数据结构排序的数据集。如果我要声明它,它看起来像这样:

$arr = array(
        array( 'name' => 'Root', 'depth' => 0 ),
        array( 'name' => 'Food', 'depth' => 0 ),
        array( 'name' => 'Fruit', 'depth' => 1 ),
        array( 'name' => 'Bannnanna', 'depth' => 2 ),
        array( 'name' => 'Apple', 'depth' => 2 ),
        array( 'name' => 'Bannnanna', 'depth' => 2 ),
        array( 'name' => 'Meat', 'depth' => 1 ),
        array( 'name' => 'Furniture', 'depth' => 0 )
        );

我想要的是将这个 $arr 输入到一个方法中,这样我就可以得到一个多维数组。

例如,Fruit 将是 Food 的子级。 Bananana 将是 Fruit 的孩子。 我需要每个“孩子”的键都是“页面”。

我上面展示的数组还可以返回其他信息,例如“lft”和“rgt”。我没有设置“parentId”,但如果需要,我可以更改我的模型,但我更愿意坚持使用嵌套集模型。

【问题讨论】:

    标签: php


    【解决方案1】:

    可能是这样的

                $arr = array(
                        array( 'name' => 'Root', 'depth' => 0 ),
                        array( 'name' => 'Food', 'depth' => 0 ),
                        array( 'name' => 'Fruit', 'depth' => 1 ),
                        array( 'name' => 'Bannnanna', 'depth' => 2 ),
                        array( 'name' => 'Apple', 'depth' => 2 ),
                        array( 'name' => 'Bannnanna', 'depth' => 2 ),
                        array( 'name' => 'Meat', 'depth' => 1 ),
                        array( 'name' => 'Furniture', 'depth' => 0 )
                        );
    
                $p = array(array());
                foreach($arr as $n => $a) {
                    $d = $a['depth'] + 1;
                    $p[$d - 1]['children'][] = &$arr[$n];
                    $p[$d] = &$arr[$n];
                }
    
                print_r($p[0]);
    

    【讨论】:

    • 请您解释一下 foreach 代码,因为我真的不知道按引用返回是如何工作的!谢谢
    • @Laykes,你做了什么改变?
    • 对不起 mattalexx:我什至不记得问过这个问题了。
    【解决方案2】:

    以下代码假定您的值的顺序和深度是正确的。请注意,它使用键删除重复项。

     header('Content-Type: text/plain');
    
     $arr = array(
         array( 'name' => 'Root', 'depth' => 0 ),
         array( 'name' => 'Food', 'depth' => 0 ),
         array( 'name' => 'Fruit', 'depth' => 1 ),
         array( 'name' => 'Bannnanna', 'depth' => 2 ),
         array( 'name' => 'Apple', 'depth' => 2 ),
         array( 'name' => 'Bannnanna', 'depth' => 2 ),
         array( 'name' => 'Meat', 'depth' => 1 ),
         array( 'name' => 'Furniture', 'depth' => 0 )
     );
    
     function process( &$arr, &$prev_sub = null, $cur_depth = 0 ) {
      $cur_sub = array();
      while( $line = current( $arr ) ) {
       if( $line['depth'] < $cur_depth ) {
        return $cur_sub;
       } elseif( $line['depth'] > $cur_depth ) {
        $prev_sub = process( $arr, $cur_sub, $cur_depth + 1 );
       } else {
        $cur_sub[$line['name']] = $line['name'];
        $prev_sub =& $cur_sub[$line['name']];
        next( $arr );
       }
      }
      return $cur_sub;
     }
    
     $values = process( $arr );
     print_r( $values );
    

    输出:

     Array
     (
         [Root] => Root
         [Food] => Array
             (
                 [Fruit] => Array
                     (
                         [Bannnanna] => Bannnanna
                         [Apple] => Apple
                     )
                 [Meat] => Meat
             )
         [Furniture] => Furniture
     )
    

    【讨论】:

    • 这正是我一直在寻找的,效果很好!你能发布如何添加其他字段吗?
    猜你喜欢
    • 2022-06-17
    • 1970-01-01
    • 2012-03-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-11
    • 2021-12-06
    • 1970-01-01
    相关资源
    最近更新 更多