2014-10-02 83 views
0

PHP匹配的foreach值我有以下陣列:與多維數組

Array 
    (
     [0] => Array 
      (
       [year] => 1 
       [month] => Array 
        (
         [0] => Array 
          (
           [month] => 2 
           [value] => 600 
          ) 

         [1] => Array 
          (
           [month] => 3 
           [value] => 600 
          ) 

         [2] => Array 
          (
           [month] => 4 
           [value] => 600 
          ) 
        ) 
      ) 
     [1] => Array 
      (
       [year] => 5 
       [month] => Array 
        (
         [0] => Array 
          (
           [month] => 6 
           [value] => 80 
          ) 

         [1] => Array 
          (
           [month] => 7 
           [value] => 90 
          ) 

         [2] => Array 
          (
           [month] => 8 
           [value] => 100 
          ) 
        ) 
      ) 
    ) 

而且我有10年還的foreach每個月一個foreach。事情是這樣的:

foreach (range(1, 10) as $year) { 
    foreach (range(1, 12) as $month) { 
      $value = $month; 
    } 
} 

現在的問題是如何,我可以在foreach數組匹配改變$值,如果$年$月​​它在陣列中,如果年/月組合它的上$ value值需要是數組中那個月份的數組。

+1

你能改述你想做什麼嗎?我不認爲我理解它。 – ConnectedSystems 2014-10-02 11:54:39

回答

0

已經寫在下面,值得一提的是,整個演習似乎有點毫無意義。 當你在十年的時間裏迭代每個月時,迭代數據並檢查年份是否匹配會非常簡單(因爲當年的月份在邏輯上不能超出範圍1-12),而不是迭代至120個月看看數據是否包含在該月的值:

foreach($data as $year_data) { 
    if(in_array($year_data['year'], range(1,10)){ 
     foreach($year['month'] as $month) { 
      echo = $month['value']; 
     } 
    } 
} 

那麼它不知道你要的數據做什麼,而是要得到它,你將需要遍歷數組與嵌套的foreach循環:

foreach (range(1, 10) as $year) { 
    foreach (range(1, 12) as $month) { 
     //iterate the array to find the correct element 
     $foundValue = false; 
     foreach($data as $year_data){ 
      if($year_data['year']==$year){ 
       foreach($year_data['month'] as $month_data){ 
        if($month_data['month']==$month){ 
         //do something with the data 
         $foundValue = $month_data['value']; 
        } 
       } 
      } 
     } 
     echo ($foundValue) ?: $defaultValue; 
    } 
} 

如果你co ULD重組數據陣列按年份和月份進行索引,例如:

$data = array(
     'year_1'=>array(
         'month_2'=>600, 
         'month_3'=>600, 
         'month_4'=>600 
        ), 
     'year_5'=>array(
         'month_6'=>80, 
         'month_7'=>90, 
         'month_8'=>100 
        ), 
    ); 

然後,你可以訪問這些數據容易得多:

foreach (range(1, 10) as $year) { 
    foreach (range(1, 12) as $month) { 
     //access value directly via keys: 
     if(isset($data['year_'.$year]['month_'.$month];)){ 
      echo $data['year_'.$year]['month_'.$month]; 
     }else{ 
      echo $defaultValue; 
     } 
    } 
} 

即使你不能改變數據是如何創建的,你仍然可以創建一個新的數組與上述結構:

$newData = array(); 

foreach($data as $year_data){ 
    $year = 'year_'.$year_data['year']; 
    $months = array(); 
    foreach($year_data['month'] as $month_data){ 
     $months['month_'.$month_data['month']]=$month_data['value']; 
    } 
    $newData[$year]=$months; 
} 

然後你就可以代替$data在簡化的例子使用上面$newData

+0

Steve和@Dr Casper Black,感謝您的非常完整的回答,這可以工作,但我也需要顯示默認的月份值。'if($ month_data ['month'] == $ month){ echo $ month_data ['value']; ($ month_data ['month'] == $ month){ echo $ month_data ['value'];}我試過類似'if($ month_data ['month'] == $ month){ echo $ month_data ['value']; } else {echo $ default_month_value;}'但是這種方式每個月都會重複該數組中的月份數。 – 2014-10-02 12:52:33

+0

@AlexandruBurdulea那麼你需要將值存儲在內部循環之外,然後在這些循環之後,如果值存在,則回顯它,否則回顯默認值。我不知道默認應該是什麼,所以我在我編輯的答案中使用了'$ defaultValue' – Steve 2014-10-02 13:06:10

+0

@AlexandruBurdulea如果您使用第一個示例,還會添加break以避免不必要的循環(提示 - 您不應該重構一次並使用第二個示例效率更高) – Steve 2014-10-02 13:09:24

0

您的問題含糊不清,但這可能對您有所幫助。這將通過年/月的排列,檢查年份是否對應,如果是,它將檢查月份是否匹配,如果是則顯示值。

年和月範圍將匹配您所有的數據陣列條目。

foreach (range(1, 10) as $year) { 
    foreach (range(1, 12) as $month) { 
     foreach($ar as $row){ 
      if ($row['year'] == $year){ 
       foreach($row['month'] as $rowMonth){ 
        if($rowMonth['month'] == $month){ 
         echo "match: Y:".$row['year']." - m:".$rowMonth['month']." -> ". $rowMonth['value']."<br>"; 
        } 

       } 
      } 
     } 
    } 
} 
0

你的意思是這樣的嗎?

$year_month = array( array( 'year' => 1, 'month' => array( array('month' => 2, 'value' => 600), array('month' => 3, 'value' => 600), array('month' => 4, 'value' => 600) ) ), array( 'year' => 5, 'month' => array( array('month' => 6, 'value' => 80), array('month' => 7, 'value' => 90), array('month' => 8, 'value' => 100) ) ) );

foreach($year_month as $year) { foreach($year['month'] as $month) { $value = $month['value']; echo $value.'<br/>'; } }

輸出:

600 600 600 80 90 100