#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. О, да, это совершенно вылетело у меня из головы, спасибо за напоминание. Вот почему мне нравится этот сайт 🙂 Я обновлю ответ.