2015-11-21 20 views
1

我目前的PHP陣列輸出是這樣的:如何組PHP陣對一年嵌套數組

Array 
(
    [0] => Array 
     (
      [year] => 2015 
      [month] => November 
     ) 

    [1] => Array 
     (
      [year] => 2015 
      [month] => October 
     ) 

    [2] => Array 
     (
      [year] => 2015 
      [month] => September 
     ) 

    [3] => Array 
     (
      [year] => 2015 
      [month] => August 
     ) 

    [4] => Array 
     (
      [year] => 2015 
      [month] => July 
     ) 

    [5] => Array 
     (
      [year] => 2015 
      [month] => June 
     ) 

    [6] => Array 
     (
      [year] => 2015 
      [month] => May 
     ) 

    [7] => Array 
     (
      [year] => 2015 
      [month] => April 
     ) 

    [8] => Array 
     (
      [year] => 2015 
      [month] => March 
     ) 

    [9] => Array 
     (
      [year] => 2015 
      [month] => February 
     ) 

    [10] => Array 
     (
      [year] => 2015 
      [month] => January 
     ) 

    [11] => Array 
     (
      [year] => 2014 
      [month] => December 
     ) 

    [12] => Array 
     (
      [year] => 2014 
      [month] => November 
     ) 

    [13] => Array 
     (
      [year] => 2014 
      [month] => October 
     ) 

    [14] => Array 
     (
      [year] => 2014 
      [month] => September 
     ) 

    [15] => Array 
     (
      [year] => 2014 
      [month] => August 
     ) 

    [16] => Array 
     (
      [year] => 2014 
      [month] => July 
     ) 

) 

我要排序的上述陣列和組他們根據年度。我想上述轉換的陣列是讓這樣的:

Array (

[0] => Array 
    (
     [yearGroup] => 「2015」 
     [dates] => Array 
       (
        [0] => Array 
         (
          [year] => 2015 
          [month] => November 
         ) 
        [1] => Array 
         (
          [year] => 2015 
          [month] => October 
         ) 
        …etc..etc… 

       ) 
    ) 

[1] => Array 
     (
      [yearGroup] => 2014 
      [dates] => Array 
       (
        [0] => Array 
         (
          [year] => 2014 
          [month] => December 
         ) 
       [1] => Array 
         (
          [year] => 2014 
          [month] => November 
         ) 
        …etc..etc… 

       ) 
     ) 

) 

這是迄今爲止我已經試過代碼:

$calendar = // ..... The Array Above .....; 

    $sidebarCalendar = array(); 
    $currentYear = ''; 
    $i = 0; 

    foreach ($calendar as $date) { 
     if ($currentYear != $date['year']) { 
      $currentYear = $date['year']; 
      $i++; 
      $tempYearDates = array(); 
      $j = 0; 
      $tempYearDates[$j] = array(
      'year' => $date['year'], 
      'month' => $date['month'] 
     ); 
      $j++; 
      // Add to Array 
      $sidebarCalendar[$i] = array (
      'yearGroup' => $date['year'], 
      'dates'  => $tempYearDates 
     ); 
     } 
     else { 
      $tempYearDates = array(
      'year' => $date['year'], 
      'month' => $date['month'] 
     ); 
      // Locate the Array Tree 
      $currentParent = $sidebarCalendar[$i]; 
      $currentArray = $currentParent['dates']; 
      $currentArray[$j] = $tempYearDates; 
      $j++; 
     } 
    } 

但上面的輸出完整的數組是這樣的:

Array 
(
    [1] => Array 
     (
      [yearGroup] => 2015 
      [dates] => Array 
       (
        [0] => Array 
         (
          [year] => 2015 
          [month] => November 
         ) 

       ) 

     ) 

    [2] => Array 
     (
      [yearGroup] => 2014 
      [dates] => Array 
       (
        [0] => Array 
         (
          [year] => 2014 
          [month] => December 
         ) 

       ) 

     ) 

) 

有人能指出我在這裏得到了什麼錯嗎?如果有更好的方法來做同樣的事情而不是上面的方法,請指導我那裏請...

+0

你沒有添加任何東西到''sidebarCalender'在其他我認爲是什麼持有你的新陣列結構 – ElefantPhace

回答

3

你可以使用一些內置PHP的數組函數來解決這個問題。你想要做的第一件事是讓所有的獨特年該數組中,所以你可以這樣做:

$years = array_unique(array_map(function($item) { return $item['year']; }, $calendar)); 

在這裏,我用array_map得到僅含year屬性爲每個項目的數組,美聯儲它的array_unique函數只獲取唯一值。

你可以做的下一件事就是通過這些年來迭代,並填充另一個陣列,這樣的事情:

$grouped = []; 
foreach($years as $year) { 
    $grouped[$year] = array_filter($calendar, function($item) use ($year) { return $item['year'] === $year; }); 
} 

這樣你會得到在grouped變量每年的關鍵,每個鍵將包含僅由滿足array_filter條件的日曆元素組成的子陣列。

我敢肯定有更好的/更優化的方式來做到這一點(也許使用array_walkarray_reduce?),我鼓勵你找到那些!不過,請記住,PHP中有許多內置函數,閱讀他們的文檔並學習何時使用它們,它們將非常有幫助!

編輯:我意識到我的解決方案的輸出並不完全符合您的期望,但它非常容易適應。我自己更喜歡使用鍵控數組(地圖?)來代替具有屬性的常規數組,而是分別使用它們自己的!

$grouped = []; 
foreach($years as $year) { 
    $grouped[] = [ 
     'yearGroup' => $year, 
     'dates' => array_filter($calendar, function($item) use ($year) { return $item['year'] === $year; }) 
    ]; 
} 

編輯2:有時我忘了如何PHP。

+0

謝謝@juandemarco我會試一試,並會回發更新。 – Neel

+1

不客氣。我用類似的解決方案更新了我的答案,能更好地反映出您期望的輸出。 – juandemarco

+0

它確實看起來比我一直在嘗試的要簡單得多。 :) – Neel