Нужно сортировать второй вложенный массив на значение n, третье с php; 'Время начала'. Мышление, возможно, является ключом. Отправляя вложенные массивы @week @day @class, а также вызов и функцию usort, я пытаюсь изменить варианты.
Array ( [Sunday] => Array ( [0] => Array ( [Class Name] => Fun Class [Instructor] => Fun Teacher [Class Type] => Yoga Stretches [Start Time] => 1899-12-30T17:00:00 [End Time] => 1899-12-30T18:15:00 [Day Name] => Sunday ) [1] => Array ( [Class Name] => Another Fun Class [Instructor] => Same Fun Teacher [Class Type] => Relaxation [Start Time] => 1899-12-30T18:30:00 [End Time] => 1899-12-30T19:45:00 [Day Name] => Sunday ) [2] => Array ( [Class Name] => Hot Yoga without Cold [Instructor] => Dave the Flexible [Class Type] => Hot Hot Yoga [Start Time] => 1899-12-30T09:00:00 [End Time] => 1899-12-30T10:30:00 [Day Name] => Sunday ) ) [Monday] => Array ( [0] => Array ( [Class Name] => Mellow Chill Hang [Instructor] => Guru Awesome [Class Type] => Yoga Namaste [Start Time] => 1899-12-30T12:00:00 [End Time] => 1899-12-30T13:00:00 [Day Name] => Monday ) ) )
Попробовали (варианты):
foreach ($week_schedule as $day)//$week_schedule = the outer array { for($j=count($week_schedule);$j>=0;$j--) usort($day,'sortTimes'); } function sortTimes( $a, $b ) { return strtotime($a["Start Time"]) - strtotime($b["Start Time"]); }
Попробовали использовать один foreach с извлекаемыми значениями ($ day => $ class). Бьюсь об заклад, это не потребует много кода.
Попробуйте с помощью массива array_map войти во вложенные элементы, и ваше Start Time
имеет символ «T», который, как я думаю, не может использоваться с strtotime
поэтому я удалил его:
function custom_map( $array ) { usort( $array, function( $a, $b ) { return ($a['Start Time']<$b['Start Time'])? -1 : 1; }); return $array; } $new_array = array_map( "custom_map", $week_schedule ); var_dump($new_array);
демонстрация
Поскольку вам было интересно узнать, как это работает, я сделал несколько исследований сам и придумал это объяснение:
Прежде всего, вы должны знать, для чего предназначены функции array_map () и usort ().
array_map () из PHP Doc:
array_map () возвращает массив, содержащий все элементы массива1 после применения функции обратного вызова к каждому из них.
Синтаксис:
array array_map ( callable $callback , array $array1 [, array $... ] )
Простыми словами, array_map () передаст каждый элемент вашего массива функции обратного вызова, которую вы укажете. И он возвращает массив (с измененными значениями, которые вы выполнили в этой функции обратного вызова).
Теперь usort (),
usort () из PHP Doc:
Эта функция сортирует массив по его значениям, используя предоставленную пользователем функцию сравнения. Если массив, который вы хотите отсортировать, нужно отсортировать по некоторым нетривиальным критериям, вы должны использовать эту функцию.
Синтаксис:
bool usort ( array &$array , callable $value_compare_func )
Итак, usort () в основном сравнивает каждый элемент массива, чтобы сортировать его в правильном порядке. Линия, которую вы видите здесь:
return ($a['Start Time']<$b['Start Time'])? -1 : 1;
в основном переводится как:
if $a['Start Time'] is lesser than $b['Start Time'], then return -1 so that $a can come before $b
со значениями:
$a['Start Time'] = '1899-12-30T09:00:00'; //3rd element $b['Start Time'] = '1899-12-30T17:00:00'; //1st element
Теперь ясно, что $ a, который является третьим элементом, меньше, чем 1-й элемент $ b, таким образом, $ a будет располагаться перед ним. usort () делает проверку против каждой комбинации от начала до конца, чтобы сортировать.
Теперь, возвращаясь к array_map (), причина, по которой мы его используем, состоит в том, что у вас есть вложенные массивы.
То, что делает array_map () на самом деле, передает все ваши @days в usort. И затем usort берет все ваши @class и сортирует соответственно. Если вы видите следующую демонстрационную версию, в которой ваши @weeks были вывезены только @days и @class, приведенный выше код не будет работать и будет вызывать ошибки «Start Time», которые не найдены, потому что вы пытаетесь пройти через 2 вложенные массивы, когда присутствует только 1:
демонстрация
Для вышеуказанной структуры правильным методом будет реализация usort напрямую без использования array_map, например:
демонстрация