Порядок по ключу в нескольких массивах

#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. Вероятно, было бы проще выполнить этот тип сортировки на уровне базы данных

2. Прочитайте руководство

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. Спасибо за вашу помощь