2012-11-27 17 views
0

表排序多維數組的值的關鍵

cat_id | cat_parent_id | cat_name 
--------------------------------- 
12  |  0  | Car  
13  |  0  | Manga  
14  |  12  | Volvo  
15  |  12  | Mercedes-Benz  
16  |  13  | Naruto  
17  |  13  | Hunter X Hunter 
18  |  0  | Animals 


我試着去得到DB中的類別,並把它在一個數組,然後使用後陣列構建代碼的下降下拉列表。這是代碼BELOW。

while($row = dbFetchArray($result)) { 
     list($id, $parentId, $name) = $row; 

     if ($parentId == 0) { 
      // we create a new array for each top level categories 
      $categories[$id] = array('id' => $id, 'name' => $name, 'children' => array()); 
     } else { 
      // the child categories are put int the parent category's array 
      $categories[$parentId]['children'][] = array('id' => $id, 'name' => $name); 
     } 
} 

$list = ''; 
    foreach ($categories as $key => $value) { 
     $name  = "--" . strtoupper($value['name']) . "--"; 
     $children = $value['children']; 

     $list .="<option value=\"{$value['id']}\""; 
     if ($value['id'] == $catId) { 
       $list.= " selected"; 
     } 
     $list .= ">$name</option>\r\n"; 


     foreach ($children as $child) { 
      $list .= "<option value=\"{$child['id']}\""; 
      if ($child['id'] == $catId) { 
       $list.= " selected"; 
      } 

      $list .= ">{$child['name']}</option>\r\n"; 
     } 


    } 


的$類別陣列

Array 
(
    [12] => Array 
     (
      [id] => 12 
      [name] => Car 
      [children] => Array 
       (
        [0] => Array 
         (
          [id] => 14 
          [name] => Volvo 
         ) 

        [1] => Array 
         (
          [id] => 15 
          [name] => Mercedez-Benz 
         ) 

       ) 

     ) 

    [13] => Array 
     (
      [id] => 13 
      [name] => Manga 
      [children] => Array 
       (
        [0] => Array 
         (
          [id] => 16 
          [name] => Naruto 
         ) 

        [1] => Array 
         (
          [id] => 17 
          [name] => Hunter X Hunter 
         ) 

       ) 

     ) 

    [18] => Array 
     (
      [id] => 18 
      [name] => Animals 
      [children] => Array 
       (
       ) 

     ) 

) 


最終價值,但我想通過密鑰 '名' 的值進行排序$類別。

我嘗試了很多次,到目前爲止,這是我的解決方案。

function sortByName($a, $b) { 
    return strcmp($a["name"], $b["name"]); 
} 

usort($categories,"sortByName"); 

foreach($categories as $k => $v){ 
    foreach($v as $kk => $vv) { 

     if ($kk == "children") { 
      usort($vv,"sortByName"); 

      print_r($vv); 

     } 
    } 
} 


我的問題是,即使是第一個級別鍵「名」排序很好,但我的解決方案進行排序第二級沒有工作。

並且當排序發生陣列我整理成爲

像例如當我排序這由密鑰「名稱」的值18 12 13將成爲索引0 1 2

Array(
    [18] => Array 
     (
      [id] => 18 
      [name] => aa 


     ) 

    [12] => Array 
     (
      [id] => 12 
      [name] => Car 


     ) 

    [13] => Array 
     (
      [id] => 13 
      [name] => Manga 


     )    
) 

我該怎麼排序,但我也想要18 12 13沒有改變?




,所以我想我的$類別陣列是這個

Array 
(

    [18] => Array 
     (
      [id] => 18 
      [name] => Animals 
      [children] => Array 
       (
       ) 

     ) 

    [12] => Array 
     (
      [id] => 12 
      [name] => Car 
      [children] => Array 
       (
      [0] => Array 
         (
          [id] => 15 
          [name] => Mercedes-Benz 
         ) 

        [1] => Array 
         (
          [id] => 14 
          [name] => Volvo 
         ) 

      ) 

     ) 

    [13] => Array 
     (
      [id] => 13 
      [name] => Manga 
      [children] => Array 
       (
      [0] => Array 
         (
          [id] => 17 
          [name] => Hunter X Hunter 
         ) 

        [1] => Array 
         (
          [id] => 16 
          [name] => Naruto 
         ) 

       ) 

     ) 
) 
+0

0123很確定我今天早上從這個人那回答了這個問題了。 – NappingRabbit

+0

先閱讀我的問題,我對您的第一個問題與 –

回答

2

太多的努力。使用NAME作爲數組KEY,然後按關鍵字進行排序ksort

+0

不一樣,您可以添加更多詳細信息。但是你得到了我對原則的投票。 – artragis

+0

我終於得到你想說的,我修復我的代碼。謝謝 –

0

我認爲問題在於PHP不會將這些數字索引解釋爲鍵,只是索引,以便它在排序後不保留它們。如果你將它們轉換爲字符串然後進行排序,我懷疑它會保留它們。或者,你可以將數字鍵與你的名字交換(當然,如果名字是唯一的),做一個簡單的ksort(如前面的答案中所建議的),然後將它們交換回來。

+0

它只是usort函數(如排序)不保留鍵。它在文檔中http://fr2.php.net/manual/en/function.usort.php – artragis

0

你使用uksort來執行你想要的。但是你的設計有問題。

就像@Lukasz Kujawa所說的,php數組被設計爲在O(1)中被訪問。作爲C數組,您的設計將所有內容都強制爲O(n)並在該過程中添加一個步驟。

我會給你uksort的「解決方案」,但對我來說這不是件好事。

uksort($categories,function($a,$b)use($categories){ 
     return return strcmp($categories[$a]["name"], $categories[$b]["name"]); 
} 
+0

什麼是O和C陣列對不起,我是一個新手 –

+0

O(1)是一個符號,這意味着你可以做一些操作在不變的操作中,無論數值如何。 O(n)表示你做k * n + c指令「n」是你問題的參數。 「C」只是一種語言。在這種語言中,數組是「真」數組,沒有「關鍵值」關聯的想法。因此,您總是使用搜索功能來查找索引,然後訪問該值來對數組進行排序。在PHP中,有了這個關鍵的想法,你可以避免搜索。 – artragis

+0

但我將需要該設計來建立我的下拉列表 –