【问题标题】:Sorting an array into a multidimensional array based on "parent_id"根据“parent_id”将数组排序为多维数组
【发布时间】:2010-04-05 18:33:39
【问题描述】:

我通过为每个“专辑”分配一个“parent_album_id”来在 mysql 中存储一个无限嵌套的目录结构(除非它位于顶层,在这种情况下它没有 parent_album_id)。

我首先从数据库中获取所有专辑的数组,并将每个专辑的键更改为它的“id”(自动增量 id)。

接下来,我想将相册数组重新组织成一个多维数组,将子相册存储在每个相册的“children”中。我已经取得了一些成功。如果我只需要在数组中下降一层,下面的代码就可以正常工作,但是如果我下降不止一层,它就会丢失数组的完整结构。这是因为当我递归调用 array_search_key 时,我没有传递完整的数组,只是传递了我想要搜索的下一个级别。

如何递归搜索数组,但返回整个专辑的多维数组?

foreach ($albums as &$album){
    if($album['parent_album_id']){ // Move album if it has a parent
        $insert_album = $album;
        unset($albums[$album['id']]); // Remove album from the array, since we are going to insert it into its parent
        $results = array_search_key($album['parent_album_id'],$albums,$insert_album, $albums);
        if($results){
            $albums = $results;
        }
    }
}

function array_search_key( $needle_key, $array , $insert_album) {
   foreach($array AS $key=>&$value){
       if($key == $needle_key) {
           $array[$key]['children'][$insert_album['id']] = $insert_album;
           return $array;
       }
       if(is_array($value) && is_array($value['children'])){    
           if( ($result = array_search_key($needle_key, $value['children'], $insert_album)) !== false)
           return $result;
       }
   }
   return false;
}

【问题讨论】:

    标签: php arrays sorting multidimensional-array


    【解决方案1】:
    // you already managed to get the array into this form
    $albums = array(
      1 => array('id'=>1, 'title'=>'Album 1', 'parentId'=>null),
      2 => array('id'=>2, 'title'=>'Album 2', 'parentId'=>null),
      3 => array('id'=>3, 'title'=>'Album 1.1', 'parentId'=>1),
      4 => array('id'=>4, 'title'=>'Album 1.1.1', 'parentId'=>3),
      5 => array('id'=>5, 'title'=>'Album 2.1', 'parentId'=>2),
      6 => array('id'=>6, 'title'=>'Album 1.1.2', 'parentId'=>3),
      7 => array('id'=>7, 'title'=>'Album 1.1.3', 'parentId'=>3)
    );
    
    print_r(foo($albums));
    
    
    function foo($albums) {
      $rv = array();
      foreach( $albums as &$album) {
        if ( is_null($album['parentId']) ) {
          // no parentId -> entry in the root array
          $rv[] = &$album;
        }
        else {
          $pid = $album['parentId'];
          if ( !isset($albums[$pid]) ) {
            echo 'orphant album: ', $album['id'], "\n";
          }
          else {
            if ( !isset($albums[$pid]['children']) ) {
              $albums[$pid]['children'] = array();
            }
            $albums[$pid]['children'][] = &$album;
          }
        }
      }
      return $rv;
    }
    

    打印

    Array
    (
      [0] => Array
        (
        [id] => 1
        [title] => Album 1
        [parentId] => 
        [children] => Array
          (
            [0] => Array
            (
              [id] => 3
              [title] => Album 1.1
              [parentId] => 1
              [children] => Array
                (
                [0] => Array
                  (
                    [id] => 4
                    [title] => Album 1.1.1
                    [parentId] => 3
                  )
    
                [1] => Array
                  (
                    [id] => 6
                    [title] => Album 1.1.2
                    [parentId] => 3
                  )
    
                [2] => Array
                  (
                    [id] => 7
                    [title] => Album 1.1.3
                    [parentId] => 3
                  )
    
                )
    
            )
    
          )
    
        )
    
      [1] => Array
        (
        [id] => 2
        [title] => Album 2
        [parentId] => 
        [children] => Array
          (
            [0] => Array
            (
              [id] => 5
              [title] => Album 2.1
              [parentId] => 2
            )
    
          )
    
        )
    
    )
    

    【讨论】:

    • 该功能有问题。在返回的数组中,ID 为 5 的专辑以不同的标题多次出现。
    • 脚本运行良好。但是我粘贴了脚本版本的输出,其中多个元素具有 'id'=>5(复制和粘贴错误)。已更正。
    • 谢谢,效果很好!我所做的唯一更改是在数组的最后循环并删除所有具有 parent_id 的顶级专辑(因为它们已经插入到正确的父级中)。
    猜你喜欢
    • 2021-06-29
    • 1970-01-01
    • 1970-01-01
    • 2010-10-28
    • 1970-01-01
    • 1970-01-01
    • 2020-03-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多