Как получить даты следующего месяца в массиве объектов JSON?

#php #arrays #json #date

#php #массивы #json #Дата

Вопрос:

У меня есть php code , как показано ниже, в котором 1-го числа каждого месяца я копирую содержимое 2-го массива объектов JSON (next_month) в 1-й массив объектов JSON (current_month) .

Во 2-м массиве объектов JSON (next_month) я хочу иметь даты следующего месяца. Это также будет происходить в 1-й день каждого месяца. В настоящее время я сохраняю nada . Предположим, что сегодня 1st day of November .

php-код:

 $value = json_decode(file_get_contents('../hyt/dates.json'));
    
if ((date('j') == 1)) {
    $month = 11;
    $year = date('Y');
    $current_month_days = (date('t', strtotime($year . '-' . $month . '-01')));
    $next_month_days = (date('t', strtotime($year . '-' . ($month   1) . '-01')));
    $value->current_month = $value->next_month;   // Line Y
    $value->next_month = array_fill(0, ($next_month_days), nada);    // Line Z 
}
  

Текущий вид JSON (dates.json) показан ниже:

 {"current_month": ["2020-10-01", "2020-10-02", "2020-10-03", "2020-10-04", "2020-10-05", "2020-10-06", "2020-10-07", "2020-10-08", "2020-10-09", "2020-10-10", "2020-10-10", "2020-10-12", "2020-10-13", "2020-10-14", "2020-10-15", "2020-10-16", "2020-10-17", "2020-10-18", "2020-10-19", "2020-10-20", "2020-10-21", "2020-10-22", "2020-10-23", "2020-10-24", "2020-10-25", "2020-10-26", "2020-10-27", "2020-10-28", "2020-10-29", "2020-10-30","2020-10-31"], 
"next_month": ["2020-11-01", "2020-11-02", "2020-11-03", "2020-11-04", "2020-11-05", "2020-11-06", "2020-11-07", "2020-11-08", "2020-11-09", "2020-11-11", "2020-11-11", "2020-11-12", "2020-11-13", "2020-11-14", "2020-11-15", "2020-11-16", "2020-11-17", "2020-11-18", "2020-11-19", "2020-11-20", "2020-11-21", "2020-11-22", "2020-11-23", "2020-11-24", "2020-11-25", "2020-11-26", "2020-11-27", "2020-11-28", "2020-11-29", "2020-11-30"] }
  

Постановка задачи:

Мне интересно, какие изменения я должен внести в строку Z, чтобы во втором массиве объектов JSON я мог получить даты следующего месяца. В настоящее время я сохраняю nada .

Содержимое, которое я хочу получить в JSON на 1-й день ноября месяца после успешного выполнения строки Y и строки Z, равно:

 {"current_month": ["2020-11-01", "2020-11-02", "2020-11-03", "2020-11-04", "2020-11-05", "2020-11-06", "2020-11-07", "2020-11-08", "2020-11-09", "2020-11-11", "2020-11-11", "2020-11-12", "2020-11-13", "2020-11-14", "2020-11-15", "2020-11-16", "2020-11-17", "2020-11-18", "2020-11-19", "2020-11-20", "2020-11-21", "2020-11-22", "2020-11-23", "2020-11-24", "2020-11-25", "2020-11-26", "2020-11-27", "2020-11-28", "2020-11-29", "2020-11-30"], 
"next_month": ["2020-12-01", "2020-12-02", "2020-12-03", "2020-12-04", "2020-12-05", "2020-12-06", "2020-12-07", "2020-12-08", "2020-12-09", "2020-12-11", "2020-12-11", "2020-12-12", "2020-12-13", "2020-12-14", "2020-12-15", "2020-12-16", "2020-12-17", "2020-12-18", "2020-12-19", "2020-12-20", "2020-12-21", "2020-12-22", "2020-12-23", "2020-12-24", "2020-12-25", "2020-12-26", "2020-12-27", "2020-12-28", "2020-12-29", "2020-12-30", "2020-12-31"] }
  

Это то, что я пробовал:

Это то, что я пробовал в строке Z, но он хранит только сегодняшнюю дату в массиве объектов JSON.

$value->next_month = array_fill(0, ($next_month_days), date("Y-m-d")); // Строка Z

Ответ №1:

Я думаю, вам следует полностью воссоздать свою строку JSON. Он начинается в первый день текущего месяца. Цикл всегда выполняется до тех пор, пока остается месяц. Затем все повторяется в течение следующего месяца.

 $arr = $cur = [];
$date = date_create('first day of this month 00:00');
$startMonth = $month = $date->format('m');
while($startMonth == $month){
  $cur[] = $date->format('Y-m-d');
  $date->modify(' 1 Day');
  $month = $date->format('m');
}
$arr["current_month"] = $cur;
$startMonth = $month;
$cur = [];
while($startMonth == $month){
  $cur[] = $date->format('Y-m-d');
  $date->modify(' 1 Day');
  $month = $date->format('m');
}
$arr["next_month"] = $cur;
$jsonStr = json_encode($arr);
  

Ответ №2:

Вы используете array_fill , который используется для заполнения хотя бы части массива тем же значением. Я бы рекомендовал использовать простой цикл for:

 $next_month_array = [];
$next_month = $month < 12 ? $month   1 : 1;
$year = date('Y');

for($day_counter = 1; $day_counter <= $next_month_days; $day_counter  ) {
  $next_month_array[] = "$year-$next_month-$day_counter";
}

$value->next_month = $next_month_array;
  

Комментарии:

1. $ next_month = $ month 1;? А если рождество, то следующий месяц — 13?

2. @Technoh У меня тот же вопрос. Мне интересно, какую модификацию мне нужно внести, чтобы она отображала 2021 год, если $ month равен 12.

3. О, да, это совершенно вылетело у меня из головы, спасибо за напоминание. Вот почему мне нравится этот сайт 🙂 Я обновлю ответ.