2010-04-05 112 views
1

我通過給每個「album」分配一個「parent_album_id」來存儲mysql中無限嵌套的目錄結構(除非它在頂層,在這種情況下它會沒有parent_album_id)。基於「parent_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; 
} 

回答

0
// 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 
     ) 

    ) 

    ) 

) 
+0

有些事情錯功能。在返回的數組中,ID爲5的相冊會多次出現不同的標題。 – makeee 2010-04-05 19:20:33

+0

該腳本正常工作。但是我粘貼了腳本版本的輸出,其中多個元素的'id'=> 5(複製和粘貼錯誤)。糾正。 – VolkerK 2010-04-05 19:34:03

+0

謝謝,效果很好!只有我所做的更改是在數組的最後一個循環中,並使用parent_id刪除所有頂級專輯(因爲它們已經插入正確的父代)。 – makeee 2010-04-05 21:34:39