#php
#php
Вопрос:
Я пытаюсь создать календарь (с помощью WordPress). Все работает нормально. Но, похоже, я не могу упорядочить события по часам.
На самом деле вывод :
Array (
[2020] => Array (
[October] => Array (
[21] => Array (
[18] => Array (
)
[14] => Array (
)
[12] => Array (
)
)
)
[2021] => Array (
[January] => Array (
[12] => Array (
[14] => Array (
)
[13] => Array (
)
[11] => Array (
)
)
)
)
)
Я пытаюсь получить :
Array (
[2020] => Array (
[October] => Array (
[21] => Array (
[12] => Array (
)
[14] => Array (
)
[18] => Array (
)
)
)
[2021] => Array (
[January] => Array (
[12] => Array (
[11] => Array (
)
[13] => Array (
)
[14] => Array (
)
)
)
)
)
Мой массив структурирован так :
[$year]
[$month]
[$day]
[$hour]
Как я могу заказать [$hour]
внутри [$day]
, пожалуйста?
$events_list = array();
if($events) {
foreach($events as $event) {
$date = $date_event = get_field('event_date', $event->ID, false);
$hour = $hour_start = get_field('event_hour_start', $event->ID, false);
$hour_end = get_field('event_hour_end', $event->ID, false);
$date = new DateTime($date);
$hour = new DateTime($hour);
$date_event = $date->format('l j F');
$year = $date->format('Y');
$month = $date->format('F');
$day = $date->format('d');
$hour = $hour->format('G');
$events_list[$year][$month][$day][$hour] = array('datas'=>$event, 'date'=>$date_event, 'hour_start'=>$hour_start, 'hour_end'=>$hour_end);
}
}
ksort($events_list);
Комментарии:
1. Вероятно, было бы проще выполнить этот тип сортировки на уровне базы данных
3. @Martin Я прочитал это и попытался использовать
ksort
без успеха4. @Jandon пожалуйста, отредактируйте свой вопрос и укажите это, а также покажите, как вы пытались использовать
ksort
. Это помогает нам помочь вам. Приветствия5. это
$hour_start
массив? Похоже, вы пытаетесь отсортировать строку!
Ответ №1:
Используйте ksort()
, читайте об этом подробнее. MWE (минимальный рабочий пример) для вашего варианта использования будет:
$arr = array(
2021 => array(
"October" => array(
21 => array(
18 => array(),
14 => array(),
12 => array()
)
)
)
);
ksort($arr[2021]["October"][21]);
print_r($arr);
// $arr = array(
// 2021 => array(
// "October" => array(
// 21 => array(
// 12 => array(),
// 14 => array(),
// 18 => array()
// )
// )
// )
// );
Существует также второй необязательный параметр для этой функции с именем sort_flags
, который может занимать один из следующих параметров:
SORT_REGULAR - compare items normally; the details are described in the comparison operators section. This is DEFAULT value
SORT_NUMERIC - compare items numerically
SORT_STRING - compare items as strings
SORT_LOCALE_STRING - compare items as strings, based on the current locale. It uses the locale, which can be changed using setlocale()
SORT_NATURAL - compare items as strings using "natural ordering" like natsort()
SORT_FLAG_CASE - can be combined (bitwise OR) with SORT_STRING or SORT_NATURAL to sort strings case-insensitively
редактировать: также будет работать со строковыми ключами, представляющими целочисленные значения.
Ответ №2:
Это показывает, что вы можете использовать ksort()
для сортировки по значению ключа массива.
Поэтому, чтобы отсортировать количество часов в массиве, вы можете сделать это всего одной строкой; это приведет к сортировке всех значений каждого $day
массива в естественную сортировку от низкого к высокому;
ksort($events[$year][$month][$day],SORT_NATURAL);
Полный пример с образцами данных:
$events = [];
$year = date("Y");
$month = date("F");
$day = date("d");
$hour = array('18','10','12','09');
foreach($hour as amp;$row){
$events[$year][$month][$day][$row] = mt_rand(0,222);
$events[$year][$month][$day][$row] = mt_rand(333,666);
$events[$year][$month][$day][$row] = mt_rand(7777,9999);
$events[$year][$month][$day 1][$row] = mt_rand(0,222);
$events[$year][$month][$day 1][$row] = mt_rand(333,666);
$events[$year][$month][$day 1][$row] = mt_rand(7777,9999);
}
unset($row);
// before sorting
print_R($events);
foreach($events[$year][$month] as amp;$day){
// sorts all hours inside all days in the array.
ksort($day);
}
// after sorting.
print_R($events);
Комментарии:
1. Спасибо за вашу помощь