2011-10-11 97 views
0

我有一個按年份和月份分隔的條目數組,如下所示。我需要對這個數組進行排序,以便按年份,然後按類別對條目進行「分組」。php重新排序數組

Array 
(
    [Oct 2011] => Array 
     (
      [0] => Array 
       (
        [title] => CAD Drawing Updates 
        [file] => /gm-June2010-driver.pdf 
        [category] => Windows 
       ) 
     ) 


    [Sep 2011] => Array 
     (
      [0] => Array 
       (
        [title] => title 
        [file] => /gm-June2010-driver.pdf 
        [category] => Windows 
       ) 

      [1] => Array 
       (
        [title] => edges 
        [file] => /gm-June2010-driver.pdf 
        [category] =>Walling 
       ) 

      [2] => Array 
       (
        [title] => Specification update 
        [file] => /gm-June2010-driver.pdf 
        [category] => Windows 
       ) 
     ) 
) 

所以這就是我追求的東西。

Array 
(
    [Oct 2011] => Array 
     (
       [Windows] => Array 
         (
          [0] => Array 
           (
            [title] => CAD Drawing Updates 
            [file] => /gm-June2010-driver.pdf 
           )      
         ) 
     ) 


    [Sep 2011] => Array 
     (
       [Windows] => Array 
           (
          [0] => Array 
           (
            [title] => title 
            [file] => /gm-June2010-driver.pdf 
            [category] => Windows 
           ) 


          [1] => Array 
           (
            [title] => Specification update 
            [file] => /gm-June2010-driver.pdf 
            [category] => Windows 
           )                
           ) 
       [Walling] => Array 
           (
          [0] => Array 
           (
            [title] => edges 
            [file] => /gm-June2010-driver.pdf 
            [category] => Curtain Walling 
           )                
           )            
     ) 
) 

我不確定這是否是排序功能的工作,任何幫助將不勝感激,謝謝。

+0

這不會重新排序,但重新輸入。 – hakre

+0

不,它不是排序功能的工作,也不是排序。只要循環你的數組和條目就可以了 –

回答

1

不,這不能用sort函數完成,你需要用嵌套的foreach循環迭代你的原始數組來創建一個新的數組。

$newArr = array(); 
foreach($arr as $month => items) { 
    foreach($items as $data) { 
    $newArr[$month][$data["category"]][] = $data; 
    } 
} 
0

你不想排序,只是重命名鍵。 PHP數組不支持直接重命名鍵,因此您需要先創建一個新數組,並使用新鍵生成,同時保留現有值。

在最後你可以用新的替換原來的數組:

$rekeyed = array(); 
foreach($array as $monthYear => &$value) 
{ 
    $r = sscanf($monthYear, '%s %d', $month, $year); 
    if ($r != 2) throw new Exception(sprintf('Invalid Key "%s".', $monthYear)); 
    $categories = array(); 
    foreach($value as &$item) 
    { 
     $category =& $item['category']; 
     unset($item['category']); 
     $categories[$category][] =& $item; 
    } 
    unset($item); 
    $value =& $categories; 
    unset($categories);  
    $rekeyed[$year][$month] =& $value; 
} 
unset($value); 
$array =& $rekeyed; 
unset($rekeyed); 
print_r($array); 

輸出:

Array 
(
    [2011] => Array 
     (
      [Oct] => Array 
       (
        [Windows] => Array 
         (
          [0] => Array 
           (
            [title] => CAD Drawing Updates 
            [file] => /gm-June2010-driver.pdf 
           ) 

         ) 

       ) 

      [Sep] => Array 
       (
        [Windows] => Array 
         (
          [0] => Array 
           (
            [title] => title 
            [file] => /gm-June2010-driver.pdf 
           ) 

         ) 

        [Walling] => Array 
         (
          [0] => Array 
           (
            [title] => edges 
            [file] => /gm-June2010-driver.pdf 
           ) 

         ) 

       ) 

     ) 

) 

Demo