2012-09-30 38 views
0

這是MySQL查詢推排序數組有一定的值?

Array 
(
    [0] => Array 
     (
      [CategoryID] => 7 
      [CategoryName] => Test it 
      [Parent] => 2 
      [Thumb] => 4 
      [sort] => 0 
      [MediaID] => 4 
      [MediaTitle] => asd 
      [MediaName] => 1349012691_4.jpg 
      [MediaType] => image 
      [MediaSize] => 369848 
      [UploadTime] => 1349012691 
     ) 

    [1] => Array 
     (
      [CategoryID] => 8 
      [CategoryName] => Test all 
      [Parent] => 4 
      [Thumb] => 5 
      [sort] => 0 
      [MediaID] => 5 
      [MediaTitle] => asaas 
      [MediaName] => 1349012728_9.jpg 
      [MediaType] => image 
      [MediaSize] => 416817 
      [UploadTime] => 1349012728 
     ) 

    [2] => Array 
     (
      [CategoryID] => 4 
      [CategoryName] => Test Image 
      [Parent] => 0 
      [Thumb] => 0 
      [sort] => 2 
      [MediaID] => 
      [MediaTitle] => 
      [MediaName] => 
      [MediaType] => 
      [MediaSize] => 
      [UploadTime] => 
     ) 

    [3] => Array 
     (
      [CategoryID] => 2 
      [CategoryName] => Test Sub 
      [Parent] => 1 
      [Thumb] => 0 
      [sort] => 4 
      [MediaID] => 
      [MediaTitle] => 
      [MediaName] => 
      [MediaType] => 
      [MediaSize] => 
      [UploadTime] => 
     ) 

    [4] => Array 
     (
      [CategoryID] => 3 
      [CategoryName] => Test Category 
      [Parent] => 0 
      [Thumb] => 0 
      [sort] => 6 
      [MediaID] => 
      [MediaTitle] => 
      [MediaName] => 
      [MediaType] => 
      [MediaSize] => 
      [UploadTime] => 
     ) 

    [5] => Array 
     (
      [CategoryID] => 1 
      [CategoryName] => Test Category 
      [Parent] => 0 
      [Thumb] => 0 
      [sort] => 8 
      [MediaID] => 
      [MediaTitle] => 
      [MediaName] => 
      [MediaType] => 
      [MediaSize] => 
      [UploadTime] => 
     ) 

    [6] => Array 
     (
      [CategoryID] => 5 
      [CategoryName] => Test Category 
      [Parent] => 0 
      [Thumb] => 0 
      [sort] => 10 
      [MediaID] => 
      [MediaTitle] => 
      [MediaName] => 
      [MediaType] => 
      [MediaSize] => 
      [UploadTime] => 
     ) 

    [7] => Array 
     (
      [CategoryID] => 6 
      [CategoryName] => Test Remove 
      [Parent] => 0 
      [Thumb] => 0 
      [sort] => 12 
      [MediaID] => 
      [MediaTitle] => 
      [MediaName] => 
      [MediaType] => 
      [MediaSize] => 
      [UploadTime] => 
     ) 

) 

我需要排序這個數組所以它表明父母第一類孩子,然後一類輸出數組。

我需要的輸出像

Array 
(

    [2] => Array 
     (
      [CategoryID] => 4 
      [CategoryName] => Test Image 
      [Parent] => 0 
      [Thumb] => 0 
      [sort] => 2 
      [MediaID] => 
      [MediaTitle] => 
      [MediaName] => 
      [MediaType] => 
      [MediaSize] => 
      [UploadTime] => 
     ) 
     //sub category 
      [1] => Array 
      (
       [CategoryID] => 8 
       [CategoryName] => Test all 
       [Parent] => 4 
       [Thumb] => 5 
       [sort] => 0 
       [MediaID] => 5 
       [MediaTitle] => asaas 
       [MediaName] => 1349012728_9.jpg 
       [MediaType] => image 
       [MediaSize] => 416817 
       [UploadTime] => 1349012728 
      ) 

    [3] => Array 
     (
      [CategoryID] => 2 
      [CategoryName] => Test Sub 
      [Parent] => 1 
      [Thumb] => 0 
      [sort] => 4 
      [MediaID] => 
      [MediaTitle] => 
      [MediaName] => 
      [MediaType] => 
      [MediaSize] => 
      [UploadTime] => 
     ) 
       //sub category 
       [0] => Array 
       (
        [CategoryID] => 7 
        [CategoryName] => Test it 
        [Parent] => 2 
        [Thumb] => 4 
        [sort] => 0 
        [MediaID] => 4 
        [MediaTitle] => asd 
        [MediaName] => 1349012691_4.jpg 
        [MediaType] => image 
        [MediaSize] => 369848 
        [UploadTime] => 1349012691 
       ) 

    [4] => Array 
     (
      [CategoryID] => 3 
      [CategoryName] => Test Category 
      [Parent] => 0 
      [Thumb] => 0 
      [sort] => 6 
      [MediaID] => 
      [MediaTitle] => 
      [MediaName] => 
      [MediaType] => 
      [MediaSize] => 
      [UploadTime] => 
     ) 

    [5] => Array 
     (
      [CategoryID] => 1 
      [CategoryName] => Test Category 
      [Parent] => 0 
      [Thumb] => 0 
      [sort] => 8 
      [MediaID] => 
      [MediaTitle] => 
      [MediaName] => 
      [MediaType] => 
      [MediaSize] => 
      [UploadTime] => 
     ) 

    [6] => Array 
     (
      [CategoryID] => 5 
      [CategoryName] => Test Category 
      [Parent] => 0 
      [Thumb] => 0 
      [sort] => 10 
      [MediaID] => 
      [MediaTitle] => 
      [MediaName] => 
      [MediaType] => 
      [MediaSize] => 
      [UploadTime] => 
     ) 

    [7] => Array 
     (
      [CategoryID] => 6 
      [CategoryName] => Test Remove 
      [Parent] => 0 
      [Thumb] => 0 
      [sort] => 12 
      [MediaID] => 
      [MediaTitle] => 
      [MediaName] => 
      [MediaType] => 
      [MediaSize] => 
      [UploadTime] => 
     ) 

) 

我能做到這一點用PHP?

只要你想
+1

這是不排序,但基於父母的ID分組..請糾正我,如果我錯了? – Baba

+0

當然你可以,但如果明智嗎? – JvdBerg

+0

@JvdBerg是的,我認爲它的智慧,因爲如果我排序它,我將不必循環通過2個數組來列出父類別下的兒童類別 – Marco

回答

1

您可以嘗試

# Short Version of your Array 
$oldList = Array(
    "0" => Array("CategoryID" => 7,"CategoryName" => "Test it","Parent" => 2), 
    "1" => Array("CategoryID" => 8,"CategoryName" => "Test all","Parent" => 4), 
    "2" => Array("CategoryID" => 4,"CategoryName" => "Test Image","Parent" => 0), 
    "3" => Array("CategoryID" => 2,"CategoryName" => "Test Sub","Parent" => 1), 
    "4" => Array("CategoryID" => 3,"CategoryName" => "Test Category","Parent" => 0), 
    "5" => Array("CategoryID" => 1,"CategoryName" => "Test Category","Parent" => 0), 
    "6" => Array("CategoryID" => 5,"CategoryName" => "Test Category","Parent" => 0), 
    "7" => Array("CategoryID" => 6,"CategoryName" => "Test Remove","Parent" => 0) 
); 

echo "<pre>"; 
print_r(__group($oldList)); 

功能使用

function __group($oldList) 
{ 
    # Get Category Position 
    $category = array_map(function($item) { return $item['CategoryID'];} ,$oldList); 

    #Get Only Parent List and add to new list 
    $newList = array_filter($oldList , function($item) { return $item['Parent'] == 0 ; }); 

    foreach($oldList as $key => $value) 
    { 
     if($value['Parent'] != 0) { 
      # Mapt Chiled to parent using Parent ID & Category ID 
      $newList[array_search($value['Parent'],$category)]['child'][] = $value; 
     } 
    } 
    return $newList ; 
} 

輸出

Array 
(
    [2] => Array 
     (
      [CategoryID] => 4 
      [CategoryName] => Test Image 
      [Parent] => 0 
      [child] => Array 
       (
        [0] => Array 
         (
          [CategoryID] => 8 
          [CategoryName] => Test all 
          [Parent] => 4 
         ) 

       ) 

     ) 

    [4] => Array 
     (
      [CategoryID] => 3 
      [CategoryName] => Test Category 
      [Parent] => 0 
     ) 

    [5] => Array 
     (
      [CategoryID] => 1 
      [CategoryName] => Test Category 
      [Parent] => 0 
      [child] => Array 
       (
        [0] => Array 
         (
          [CategoryID] => 2 
          [CategoryName] => Test Sub 
          [Parent] => 1 
         ) 

       ) 

     ) 

    [6] => Array 
     (
      [CategoryID] => 5 
      [CategoryName] => Test Category 
      [Parent] => 0 
     ) 

    [7] => Array 
     (
      [CategoryID] => 6 
      [CategoryName] => Test Remove 
      [Parent] => 0 
     ) 

    [3] => Array 
     (
      [child] => Array 
       (
        [0] => Array 
         (
          [CategoryID] => 7 
          [CategoryName] => Test it 
          [Parent] => 2 
         ) 

       ) 

     ) 

) 
0

這將組條目:

function groupData($data) { 
    $tree = array(); 
    $waiting = array(); 
    $index = array(); 
    foreach ($data as &$entry) { 
     $index[$entry['CategoryID']] = &$entry; 
     if (isset($waiting[$entry['CategoryID']])) { 
      $entry['children'] = &$waiting[$entry['CategoryID']]; 
     } else { 
      $entry['children'] = array(); 
     } 
     if ($entry['Parent']) { 
      if (isset($index[$entry['Parent']])) { 
       $index[$entry['Parent']]['children'][] = &$entry; 
      } else { 
       if (!isset($waiting[$entry['Parent']])) { 
        $waiting[$entry['Parent']] = array(); 
       } 
       $waiting[$entry['Parent']][] = &$entry; 
      } 
     } else { 
      $tree[] = &$entry; 
     } 
    } 
    return $tree; 
} 

如果你也需要通過結果「排序」的屬性,一些名稱或其他任何最好的是排序做,在你的SQL查詢。以上功能不會改變記錄順序。

0

可以使用代碼波紋管。這將根據排序鍵將數組分組和排序每個數組(根和子數組)。要檢索新的分組/排序數組,請使用$ newArray = groupMe($ originalArray);

function groupMe($array) { 
    $returningArray = array(); 

    $mapCatIdCategory = array(); 
    //first pass create mapCatIdCategory 
    foreach ($array as &$item) { 
     $mapCatIdCategory[$item['CategoryId']] = &$item; 
     $item['child'] = array(); 
    } 

    //second pass is for setting child 
    foreach ($array as &$item) { 
     $parentId = $item['Parent']; 
     if ($parentId == 0) { //no parent category => add to root 
      $returningArray[] = &$item; 
     } 
     else if (isset($mapCatIdCategory[$parentId])){ //not sure if data is always valid 
      $mapCatIdCategory[$parentId]['child'][] = &$item; 
     } 
    } 

    //third pass sort root and all child array(recursively) 
    recursiveSort($returningArray); 

    return $returningArray; 
} 

function recursiveSort(&$array) { 
    foreach ($array as &$item) { 
     if (count($item['child']) > 1) { //empty or 1 elements arrays are already sorted 
      recursiveSort($item['child']); //sort child 
     } 
    } 

    usort($array, "cmpCategory"); //sort array by user comparasion function 
} 

function cmpCategory($a, $b) { 
    if ($a['sort'] == $b['sort']) { 
     return 0; 
    } 
    return ($a['sort'] < $b['sort']) ? -1 : 1; 
}