2012-05-23 55 views
0

我有以下陣列結構:腓排序基於ID和PARENTID

| ID | CategoryName | ParentID 
    _________________________________ 
     1 | Movies  | -1 
    _________________________________ 
     2 | Series  | -1 
    _________________________________ 
     3 | ActionMovies | 1 
    _________________________________ 
     4 | HorrorMovies | 1 
    _________________________________ 
     5 | ComedySeries | 2 
    _________________________________ 
     6 | TVShows  | -1 

我的目標是達到以下結構

目標:

| ID | CategoryName | ParentID 
    _________________________________ 
     1 | Movies  | -1 
    _________________________________ 
     3 | ActionMovies | 1 
    _________________________________ 
     4 | HorrorMovies | 1 
    _________________________________ 
     2 | Series  | -1 
    _________________________________ 
     5 | ComedySeries | 2 
    _________________________________ 
     6 | TVShows  | -1 

或者用詞語解釋:

  • 家長分類有ParentID = -1(例如:電影)
  • 所有類別保持其原有的ID-數
  • 應該來他們ParentCategory(例ActionMovies)無子女
  • RootCategories後直接上市,在年底前來上市數組。 (示例TVShows)

我該如何用PHP實現最佳效果?我原來的MySQL查詢進不去了,所以這是不是一種選擇:)

我已經開始使用此代碼,但我不知道這是正確的道路,並以最小的努力/可讀性

 $tmpList = Categories_Models_Main::getAllCategories(); 



    $categoryData = array(); 
    foreach ($tmpList as $index => $categoryObject) { 
     $categoryData[] = array('id' => $categoryObject->id, 
           'CategoryName' => $categoryObject->parentId, 
           'name' => $categoryObject->name); 


    } 

    ///let us assume $categoryData is original state. 

    ///Beginning of manipulation and re-sorting of $tmpList 


    foreach ($categoryData as $key => $value) { 

     $mainId[$key] = $value['id']; 

     $parentId[$key] = $value['parentId']; 

    } 

    array_multisort($parentId, $mainId, $categoryData); 
+0

什麼樣的你有數組進行排序?如果你不喜歡用php的排序函數來處理,手動瀏覽數組並收集用於排序的字段,然後使用排序後的字段來完成整個事件,以正確的順序收集所有的值。 – Smar

+0

謝謝你們,我編輯了我原來的帖子。 – Confidence

回答

1

將主數組拆分爲兩部分,一部分包含沒有子部分和其他部分剩餘部分的節點。

使用array_multisort函數對項目數組進行排序,並使用您想要的標準對沒有子項的類別數組進行排序。最後一步將推動沒有孩子的陣列。

這種形式並不是最高效的,但要有第一種方法是有效的,在此之後,您可以免除優化代碼的時間。

+0

嗯......如果我沒有其他選擇,我會嘗試這個分裂的想法...似乎是我最好的選擇sofar :) – Confidence

1
$input = array(
    array("foo", "bar", "5"), 
    array("barr", "baz", "9"), 
    array("nyan", "nyu", "2") 
); 

usort($input, function($a, $b) { 
    if($a[2] < $b[2]) { 
     return -1; 
    } else if($a[2] > $b[2]) { 
     return 1; 
    } else { 
     return 0; 
    } 
}); 

var_dump($input); 

你的意思是這樣的嗎?這個想法是使用你知道的條件手動比較數組的內容。既然被排序的東西是唯一的,邏輯如何排序必須始終執行。使用PHP,大部分時間PHP的排序功能都能正確執行。

+0

看起來不太糟糕,但我不認爲這是我需要....因爲我在數組中有數組......而那些子數組可能很多。 – Confidence

+0

你知道你在排序嗎? – Smar

+0

我基於ParentID進行排序。 – Confidence

1

我很確定這不能回答你的問題,但可能會給你一些想法如何讓你的生活更輕鬆。這是問題的JavaScript方法,但這樣你甚至不必考慮對任何東西進行排序。您只需提供父母和孩子,它就會爲您分類並隨時可以使用。在我看來,這是一個非常好的方式。然而,它可能與你正在嘗試做什麼無關,但也許對於其他類似的問題,你會看到這是一個解決方案:https://developers.google.com/chart/interactive/docs/gallery/orgchart

+0

看起來整潔Andrius,但我真的需要解決它在陣列水平:) – Confidence

+1

你有沒有試過這個? http://stackoverflow.com/questions/2580248/sorting-an-array-into-a-multidimensional-array-based-on-parent-id –

+0

也有趣的樹結構:D,但不完全是我需要...我會努力工作,讓你知道我是否達到了結果。 – Confidence

0

解決此問題的唯一方法是使用自下而上的方法(我是指的是金字塔)。

說明

我們需要一個沒有父母的陣列內的行(條目)開始。就我而言,它是任何具有「parent_id = 0」的元素。一旦我們有了這些,我們需要爲每個父元素構建子元素。

後面部分將通過調用排序方法遞歸地完成,直到我們正在處理的元素沒有子元素。排序方法的結果傳遞到前一個數組點,直到數組完成。

代碼

Class Categories { 
    private $cats; 

    public function getAllCategoriesSorted() { 
     /** 
     * $this->cats = [ 
     *  'id' => x, 'parent_id' => x 
     * ]; 
     */ 
     $this->cats = Category::get()->toArray(); 

     # find categories with no parents 
     $keys = array_keys(array_column($this->cats, 'parent_id'), 0); 

     $return = []; 
     # loop through each and populate each one 
     foreach ($keys as $key) { 
      $return[$this->cats[$key]['id']] = $this->sortCategories($this->cats[$key]); 
     } 

     dd($return); 
    } 

    private function sortCategories($currentElement) { 
     # we need to check if current element has any children 
     $keys = array_keys(array_column($this->cats, 'parent_id'), $currentElement['id']); 

     if ($keys === false || empty($keys)) { 
      # we are dealing with childless element, we should return it as it is 
      return $currentElement; 
     } 

     # we are dealing with element that has children, we need to loop through each child 
     $currentElement['children'] = []; 

     foreach ($keys as $key) { 
      $currentElement['children'][$this->cats[$key]['id']] = $this->sortCategories($this->cats[$key]); 
     } 

     return $currentElement; 
    } 
} 

結果舉例

array:2 [▼ 
    65 => array:4 [▼ 
    "id" => 65 
    "name" => "Parent 1" 
    "parent_id" => 0 
    "children" => array:14 [▼ 
     66 => array:4 [▼ 
     "id" => 66 
     "name" => "Child 1" 
     "parent_id" => 65 
     "children" => array:22 [▶] 
     ] 
     87 => array:4 [▼ 
     "id" => 87 
     "name" => "Child 2" 
     "parent_id" => 65 
     "children" => array:31 [▶] 
     ] 
     117 => array:4 [▶] 
     118 => array:4 [▶] 
     120 => array:4 [▶] 
     124 => array:4 [▶] 
     125 => array:4 [▶] 
     127 => array:4 [▶] 
     225 => array:4 [▶] 
     305 => array:4 [▶] 
     434 => array:4 [▶] 
     321 => array:4 [▶] 
     348 => array:4 [▶] 
     468 => array:4 [▶] 
    ] 
    ] 
    64 => array:4 [▼ 
    "id" => 64 
    "name" => "Parent 2" 
    "parent_id" => 0 
    "children" => array:5 [▼ 
     128 => array:4 [▶] 
     132 => array:4 [▼ 
     "id" => 132 
     "name" => "Child 3" 
     "parent_id" => 64 
     "children" => array:22 [▼ 
      202 => array:3 [▶] 
      203 => array:3 [▼ 
      "id" => 203 
      "name" => "Child 4" 
      "parent_id" => 132 
      ] 
      204 => array:3 [▶] 
      205 => array:3 [▶] 
      206 => array:3 [▶] 
      207 => array:3 [▶] 
      208 => array:3 [▶] 
      209 => array:3 [▶] 
      210 => array:3 [▶] 
      211 => array:3 [▶] 
      212 => array:3 [▶] 
      213 => array:3 [▶] 
      214 => array:3 [▶] 
      215 => array:3 [▶] 
      216 => array:3 [▶] 
      217 => array:3 [▶] 
      218 => array:3 [▶] 
      220 => array:3 [▶] 
      221 => array:3 [▶] 
      222 => array:3 [▶] 
      223 => array:3 [▶] 
      224 => array:3 [▶] 
     ] 
     ] 
     134 => array:4 [▶] 
     394 => array:4 [▶] 
     454 => array:4 [▶] 
    ] 
    ] 
]