2014-10-02 3 views
0

У меня есть следующий массив:значения Foreach PHP Совпадения с многомерным массивом

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 (range(1, 10) as $year) { 
    foreach (range(1, 12) as $month) { 
      $value = $month; 
    } 
} 

Теперь проблема заключается в том, как я могу соответствовать массив с Еогеасп изменить $ значение, если $ год и $ месяц это в массиве, и если год/комбинация месяц это на массив значение $ value должно быть одним из того месяца в массиве.

+1

Не могли бы вы перефразировать то, что вы пытаетесь сделать? Я не думаю, что понимаю. – ConnectedSystems

ответ

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; 
    } 
} 

Если вы сотрудничаете пакетирования реструктурировать массив данных будет индексироваться по годам и месяцам, например:

$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; 
} 

Затем вы можете использовать $newData вместо $data в упрощенном примере выше.

+0

Steve and @Dr Casper Black, спасибо за ваш полный ответ, это работает, но мне также нужно показать значение месяца по умолчанию.'if ($ month_data ['month'] == $ month) { echo $ month_data ['value']; } 'Я пробовал что-то вроде' if ($ month_data ['month'] == $ month) { echo $ month_data ['value']; } else {echo $ default_month_value;} ', но таким образом каждый месяц повторяется число месяцев в этом массиве. –

+0

@AlexandruBurdulea Ну, вам нужно сохранить значение за пределами внутренних циклов, затем после этих циклов, если значение там, эхо, иначе эхо-значение по умолчанию. Я не знаю, что должно быть по умолчанию, поэтому я использовал '$ defaultValue' в моем отредактированном ответе – Steve

+0

@AlexandruBurdulea Также добавлен перерыв, чтобы избежать ненужных циклов, если вы используете 1-й пример (подсказка - вы не должны быть, реструктурировать один раз и использовать вторую более эффективен) – Steve

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

Смежные вопросы