Добрый день! Как можно к массиву применить месяцы? Есть массив месяцев PHP: <? $arrMonth = array( array("MONTH" => "1", "NAME" => "Январь"), array("MONTH" => "2", "NAME" =>"Февраль"), array("MONTH" => "3", "NAME" => "Март"), array("MONTH" => "4", "NAME" => "Апрель"), array("MONTH" => "5", "NAME" => "Май"), array("MONTH" => "6", "NAME" => "Июнь"), array("MONTH" => "7", "NAME" => "Июль"), array("MONTH" => "8", "NAME" => "Август"), array("MONTH" => "9", "NAME" => "Сентябрь"), array("MONTH" => "10", "NAME" => "Октябрь"), array("MONTH" => "11", "NAME" => "Ноябрь"), array("MONTH" => "12", "NAME" => "Декабрь") ); ?> Есть массив цен с порядковым номером месяца PHP: <? $arrPrices = array( array("MONTH" => "3", "VALUE" => "200"), array("MONTH" => "5", "VALUE" =>"350"), array("MONTH" => "7", "VALUE" => "240"), array("MONTH" => "12", "VALUE" => "700"), array("MONTH" => "1", "VALUE" => "200"), array("MONTH" => "3", "VALUE" =>"350"), array("MONTH" => "8", "VALUE" => "240"), array("MONTH" => "8", "VALUE" => "280"), ); ?> Как можно сделать один массив с полным перечнем месяцев чтобы на выходе получить PHP: <? $arrPrices = array( array("MONTH" => "1", "VALUE" => ""), array("MONTH" => "2", "VALUE" => ""), array("MONTH" => "3", "VALUE" => "200"), array("MONTH" => "4", "VALUE" => ""), array("MONTH" => "5", "VALUE" =>"350"), array("MONTH" => "6", "VALUE" => ""), array("MONTH" => "7", "VALUE" => "240"), array("MONTH" => "8", "VALUE" => ""), array("MONTH" => "9", "VALUE" => ""), array("MONTH" => "10", "VALUE" => ""), array("MONTH" => "11", "VALUE" => ""), array("MONTH" => "12", "VALUE" => "700"), array("MONTH" => "1", "VALUE" => "200"), array("MONTH" => "2", "VALUE" => ""), array("MONTH" => "3", "VALUE" =>"350"), array("MONTH" => "4", "VALUE" => ""), array("MONTH" => "5", "VALUE" => ""), array("MONTH" => "6", "VALUE" => ""), array("MONTH" => "7", "VALUE" => ""), array("MONTH" => "8", "VALUE" => "240"), array("MONTH" => "8", "VALUE" => "280"), array("MONTH" => "9", "VALUE" => ""), array("MONTH" => "10", "VALUE" => ""), array("MONTH" => "11", "VALUE" => ""), array("MONTH" => "12", "VALUE" => ""), ); ?>
Я конечно не понимаю почему у тебя в итоговом массиве несколько раз дублируются месяца. Но вот я так сделал. Может можно и короче. PHP: $NewArr = []; foreach($arrMonth as $item){ $m = $item['MONTH']; $price = ''; foreach($arrPrices as $item2){ if($m == $item2['MONTH']){ $price = $item2['VALUE']; break; } } $NewArr[$m] = [ 'MONTH' => $m, 'VALUE' => $price, ]; } Код (Text): Вот итог array ( 1 => array ( 'MONTH' => '1', 'VALUE' => '200', ), 2 => array ( 'MONTH' => '2', 'VALUE' => '', ), 3 => array ( 'MONTH' => '3', 'VALUE' => '200', ), 4 => array ( 'MONTH' => '4', 'VALUE' => '', ), 5 => array ( 'MONTH' => '5', 'VALUE' => '350', ), 6 => array ( 'MONTH' => '6', 'VALUE' => '', ), 7 => array ( 'MONTH' => '7', 'VALUE' => '240', ), 8 => array ( 'MONTH' => '8', 'VALUE' => '240', ), 9 => array ( 'MONTH' => '9', 'VALUE' => '', ), 10 => array ( 'MONTH' => '10', 'VALUE' => '', ), 11 => array ( 'MONTH' => '11', 'VALUE' => '', ), 12 => array ( 'MONTH' => '12', 'VALUE' => '700', ), )
Спасибо за внимание Немного не так Смысл заключается в том, что это разные годы PHP: <? $arrPrices = array( array("DATE" => "01.03.2015", "MONTH" => "3", "VALUE" => "200"), /// 2015 год /// array("DATE" => "01.05.2015", "MONTH" => "5", "VALUE" =>"350"), /// 2015 год /// array("DATE" => "01.07.2015", "MONTH" => "7", "VALUE" => "240"), /// 2015 год /// array("DATE" => "01.12.2015", "MONTH" => "12", "VALUE" => "700"), /// 2015 год /// array("DATE" => "01.01.2016", "MONTH" => "1", "VALUE" => "200"), /// 2016 год /// array("DATE" => "01.03.2016", "MONTH" => "3", "VALUE" =>"350"), /// 2016 год /// array("DATE" => "01.08.2016", "MONTH" => "8", "VALUE" => "240"), /// 2016 год /// array("DATE" => "01.08.2016", "MONTH" => "8", "VALUE" => "280"), /// 2016 год /// ); ?> порядок массива $arrPrices не должен нарущаться И если есть например два одинаковых месяца в одном году array("DATE" => "01.08.2016", "MONTH" => "8", "VALUE" => "240"), /// 2016 год /// array("DATE" => "01.08.2016", "MONTH" => "8", "VALUE" => "280"), /// 2016 год /// то они должны быть указаны оба Результат должен быть таким Код (Text): array ( 1 => array ( 'MONTH' => '1', 'VALUE' => '', ), 2 => array ( 'MONTH' => '2', 'VALUE' => '', ), 3 => array ( 'MONTH' => '3', 'VALUE' => '200', ), 4 => array ( 'MONTH' => '4', 'VALUE' => '', ), 5 => array ( 'MONTH' => '5', 'VALUE' => '350', ), 6 => array ( 'MONTH' => '6', 'VALUE' => '', ), 7 => array ( 'MONTH' => '7', 'VALUE' => '240', ), 8 => array ( 'MONTH' => '8', 'VALUE' => '240', ), 9 => array ( 'MONTH' => '9', 'VALUE' => '', ), 10 => array ( 'MONTH' => '10', 'VALUE' => '', ), 11 => array ( 'MONTH' => '11', 'VALUE' => '', ), 12 => array ( 'MONTH' => '12', 'VALUE' => '700', ), 13 => array ( 'MONTH' => '1', 'VALUE' => '200', ), 14 => array ( 'MONTH' => '2', 'VALUE' => '', ), 15 => array ( 'MONTH' => '3', 'VALUE' => '350', ), 16 => array ( 'MONTH' => '4', 'VALUE' => '', ), 17 => array ( 'MONTH' => '5', 'VALUE' => '', ), 18 => array ( 'MONTH' => '6', 'VALUE' => '', ), 19 => array ( 'MONTH' => '7', 'VALUE' => '', ), 20 => array ( 'MONTH' => '8', 'VALUE' => '240', ), 21 => array ( 'MONTH' => '8', 'VALUE' => '280', ), 22 => array ( 'MONTH' => '9', 'VALUE' => '', ), 23 => array ( 'MONTH' => '10', 'VALUE' => '', ), 24 => array ( 'MONTH' => '11', 'VALUE' => '', ), 25 => array ( 'MONTH' => '12', 'VALUE' => '', ), )
Ну тогда убери из ключа массив в моем примере вот так и тогда у тебя будут дублироваться PHP: $NewArr = []; foreach($arrMonth as $item){ $m = $item['MONTH']; $price = ''; foreach($arrPrices as $item2){ if($m == $item2['MONTH']){ $price = $item2['VALUE']; break; } } $NewArr[] = [ 'MONTH' => $m, 'VALUE' => $price, ]; }
@Михаил77, вы в курсе, что означает словосочетание "обезьяна с гранатой"? В данном случае РНР выступает в роли гранаты. То что вы сейчас делаете потенциально опасно и далеко не только для вас. Я понимаю, что "блажен тот кто не ведает..." но не до такой же степени
Не работает Вот какой результат получается PHP: Array ( [0] => Array ( [MONTH] => 1 [VALUE] => 200 ) [1] => Array ( [MONTH] => 2 [VALUE] => ) [2] => Array ( [MONTH] => 3 [VALUE] => 200 ) [3] => Array ( [MONTH] => 4 [VALUE] => ) [4] => Array ( [MONTH] => 5 [VALUE] => 350 ) [5] => Array ( [MONTH] => 6 [VALUE] => ) [6] => Array ( [MONTH] => 7 [VALUE] => 240 ) [7] => Array ( [MONTH] => 8 [VALUE] => 240 ) [8] => Array ( [MONTH] => 9 [VALUE] => ) [9] => Array ( [MONTH] => 10 [VALUE] => ) [10] => Array ( [MONTH] => 11 [VALUE] => ) [11] => Array ( [MONTH] => 12 [VALUE] => 700 ) )
@Михаил77, если массив цен отсортирован по датам и месяцам, то: PHP: $aResult = []; $year = false; $i = 1; foreach($arrPrices as $item) { $timestamp = strtotime($item['DATE']); $itemYear = date('Y', $timestamp); if($year !== $itemYear) { $year = $itemYear; $aMonthItem = reset($arrMonth); } elseif($aMonthItem['MONTH'] !== $item['MONTH']) { $aMonthItem = next($arrMonth); } while($aMonthItem !== false && $aMonthItem['MONTH'] !== $item['MONTH']) { $aResult[$i++] = ['MONTH' => $aMonthItem['MONTH'], 'VALUE' => '']; $aMonthItem = next($arrMonth); } if($aMonthItem['MONTH'] == $item['MONTH']) { $aResult[$i++] = ['MONTH' => $item['MONTH'], 'VALUE' => $item['VALUE']]; } } while(($aMonthItem = next($arrMonth)) !== false) { $aResult[$i++] = ['MONTH' => $aMonthItem['MONTH'], 'VALUE' => '']; } Если не принципиально, чтобы результирующий массив начинался с индекса 1, то можно убрать использование переменной $i.
Спасибо, но немного не то результат должен быть такой Код (Text): array ( 1 => array ( 'MONTH' => '1', 'VALUE' => '', ), 2 => array ( 'MONTH' => '2', 'VALUE' => '', ), 3 => array ( 'MONTH' => '3', 'VALUE' => '200', ), 4 => array ( 'MONTH' => '4', 'VALUE' => '', ), 5 => array ( 'MONTH' => '5', 'VALUE' => '350', ), 6 => array ( 'MONTH' => '6', 'VALUE' => '', ), 7 => array ( 'MONTH' => '7', 'VALUE' => '240', ), 8 => array ( 'MONTH' => '8', 'VALUE' => '240', ), 9 => array ( 'MONTH' => '9', 'VALUE' => '', ), 10 => array ( 'MONTH' => '10', 'VALUE' => '', ), 11 => array ( 'MONTH' => '11', 'VALUE' => '', ), 12 => array ( 'MONTH' => '12', 'VALUE' => '700', ), 13 => array ( 'MONTH' => '1', 'VALUE' => '200', ), 14 => array ( 'MONTH' => '2', 'VALUE' => '', ), 15 => array ( 'MONTH' => '3', 'VALUE' => '350', ), 16 => array ( 'MONTH' => '4', 'VALUE' => '', ), 17 => array ( 'MONTH' => '5', 'VALUE' => '', ), 18 => array ( 'MONTH' => '6', 'VALUE' => '', ), 19 => array ( 'MONTH' => '7', 'VALUE' => '', ), 20 => array ( 'MONTH' => '8', 'VALUE' => '240', ), 21 => array ( 'MONTH' => '8', 'VALUE' => '280', ), 22 => array ( 'MONTH' => '9', 'VALUE' => '', ), 23 => array ( 'MONTH' => '10', 'VALUE' => '', ), 24 => array ( 'MONTH' => '11', 'VALUE' => '', ), 25 => array ( 'MONTH' => '12', 'VALUE' => '', ), )
И это самое "немного не то" будет продолжаться до бесконечности. Ну что же молодой человек, игнорируя мои советы вы сделали выбор. Надеюсь осознанный (хотя слабо на это рассчитываю). В свою очередь не люблю оставаться в долгу, поэтому больше меня в своих темах вы не увидите.
Наверное я Вам не совсем понятно изложил смысл, прошу посмотреть еще разок Вот массив месяцев PHP: <? $arrPrices = array( array("MONTH" => "1", "NAME" => "Январь"), array("MONTH" => "2", "NAME" =>"Февраль"), array("MONTH" => "3", "NAME" => "Март"), array("MONTH" => "4", "NAME" => "Апрель"), array("MONTH" => "5", "NAME" => "Май"), array("MONTH" => "6", "NAME" => "Июнь"), array("MONTH" => "7", "NAME" => "Июль"), array("MONTH" => "8", "NAME" => "Август"), array("MONTH" => "9", "NAME" => "Сентябрь"), array("MONTH" => "10", "NAME" => "Октябрь"), array("MONTH" => "11", "NAME" => "Ноябрь"), array("MONTH" => "12", "NAME" => "Декабрь") ); ?> Вот массив цен PHP: <? $arrPrices = array( array("DATE" => "01.03.2015", "MONTH" => "3", "VALUE" => "200"), /// 2015 год /// array("DATE" => "01.05.2015", "MONTH" => "5", "VALUE" =>"350"), /// 2015 год /// array("DATE" => "01.07.2015", "MONTH" => "7", "VALUE" => "240"), /// 2015 год /// array("DATE" => "01.12.2015", "MONTH" => "12", "VALUE" => "700"), /// 2015 год /// array("DATE" => "01.01.2016", "MONTH" => "1", "VALUE" => "200"), /// 2016 год /// array("DATE" => "01.03.2016", "MONTH" => "3", "VALUE" =>"350"), /// 2016 год /// array("DATE" => "01.08.2016", "MONTH" => "8", "VALUE" => "240"), /// 2016 год /// array("DATE" => "15.08.2016", "MONTH" => "8", "VALUE" => "280"), /// 2016 год /// ); ?> По сути получается что в массиве цен содержится информация за два года, поэтому итоговый массив должен содержать 12 месяцев по 2015 году и 12 месяцев по 2016 году при этом август "8" в 2016 году повторяется 2 раза Результат должен быть таким Код (Text): array ( 1 => array ( 'DATE' => '', 'MONTH' => '1', 'VALUE' => '', ), 2 => array ( 'DATE' => '', 'MONTH' => '2', 'VALUE' => '', ), 3 => array ( 'DATE' => '01.03.2015', 'MONTH' => '3', 'VALUE' => '200', ), 4 => array ( 'DATE' => '', 'MONTH' => '4', 'VALUE' => '', ), 5 => array ( 'DATE' => '01.05.2015', 'MONTH' => '5', 'VALUE' => '350', ), 6 => array ( 'DATE' => '', 'MONTH' => '6', 'VALUE' => '', ), 7 => array ( 'DATE' => '01.07.2015', 'MONTH' => '7', 'VALUE' => '240', ), 8 => array ( 'DATE' => '', 'MONTH' => '8', 'VALUE' => '', ), 9 => array ( 'DATE' => '', 'MONTH' => '9', 'VALUE' => '', ), 10 => array ( 'DATE' => '', 'MONTH' => '10', 'VALUE' => '', ), 11 => array ( 'DATE' => '', 'MONTH' => '11', 'VALUE' => '', ), 12 => array ( 'DATE' => '01.12.2015', 'MONTH' => '12', 'VALUE' => '700', ), 13 => array ( 'DATE' => '01.01.2016', 'MONTH' => '1', 'VALUE' => '200', ), 14 => array ( 'DATE' => '', 'MONTH' => '2', 'VALUE' => '', ), 15 => array ( 'DATE' => '01.03.2016', 'MONTH' => '3', 'VALUE' => '350', ), 16 => array ( 'DATE' => '', 'MONTH' => '4', 'VALUE' => '', ), 17 => array ( 'DATE' => '', 'MONTH' => '5', 'VALUE' => '', ), 18 => array ( 'DATE' => '', 'MONTH' => '6', 'VALUE' => '', ), 19 => array ( 'DATE' => '', 'MONTH' => '7', 'VALUE' => '', ), 20 => array ( 'DATE' => '01.08.2016', 'MONTH' => '8', 'VALUE' => '240', ), 21 => array ( 'DATE' => '15.08.2016', 'MONTH' => '8', 'VALUE' => '280', ), 22 => array ( 'DATE' => '', 'MONTH' => '9', 'VALUE' => '', ), 23 => array ( 'DATE' => '', 'MONTH' => '10', 'VALUE' => '', ), 24 => array ( 'DATE' => '', 'MONTH' => '11', 'VALUE' => '', ), 25 => array ( 'DATE' => '', 'MONTH' => '12', 'VALUE' => '', ), )
@Михаил77, появился индекс 'DATE' и итоговом массиве В 13-ю и 21-ю строчки замените на PHP: $aResult[$i++] = ['DATE' => '', 'MONTH' => $aMonthItem['MONTH'], 'VALUE' => '']; , а 17-ю на PHP: $aResult[$i++] = ['DATE' => $item['DATE'], 'MONTH' => $item['MONTH'], 'VALUE' => $item['VALUE']];
12 месяцев 16-го содержит. Завершающий цикл while это обеспечивает. Просто присмотритесь. Но был один нюанс с возможным отсутствием в исходных данных 12-го месяца в середине массива цен. PHP: $aResult = []; $year = false; $i = 1; foreach($arrPrices as $item) { $timestamp = strtotime($item['DATE']); $itemYear = date('Y', $timestamp); if($year !== $itemYear) { // смена года if($year !== false) { // если не первая смена год while(($aMonthItem = next($arrMonth)) !== false) { // забить остаток $aResult[$i++] = ['DATE' => '', 'MONTH' => $aMonthItem['MONTH'], 'VALUE' => '']; } } $year = $itemYear; $aMonthItem = reset($arrMonth); } elseif($aMonthItem['MONTH'] !== $item['MONTH']) { $aMonthItem = next($arrMonth); } while($aMonthItem !== false && $aMonthItem['MONTH'] !== $item['MONTH']) { $aResult[$i++] = ['DATE' => '', 'MONTH' => $aMonthItem['MONTH'], 'VALUE' => '']; $aMonthItem = next($arrMonth); } if($aMonthItem['MONTH'] == $item['MONTH']) { $aResult[$i++] = ['DATE' => $item['DATE'], 'MONTH' => $item['MONTH'], 'VALUE' => $item['VALUE']]; } } while(($aMonthItem = next($arrMonth)) !== false) { $aResult[$i++] = ['DATE' => '', 'MONTH' => $aMonthItem['MONTH'], 'VALUE' => '']; }