Intereting Posts
Как заблокировать IE8 и вниз? Регулярное выражение не работает должным образом с турецкими персонажами Столбец запроса драйвера php mongodb Насколько безопасна функция завитки от обнюхивания? Symfony2: вызов form_widget в исключении twig throws «Catchable fatal error … должен быть экземпляром Symfony \ Component \ Form \ FormView» Как очистить первый абзац от страницы википедии? Как сопоставить и использовать представление БД из Doctrine2 Плюсы / минусы использования index.php? Q = путь / вместо index.php / path / при маршрутизации URL-адресов? Интеграция Magento и Moodle Parsley.js Отправить форму не работает при использовании addAsyncValidator и удаленного Самый простой способ активировать PHP и MySQL на Mac OS 10.6 (Snow Leopard), 10.7 (Lion), 10.8 (Mountain Lion)? Где хранятся статические блоки CMS Magento? file_get_contents или readfile для отображения образа файловой системы howto: динамическое обновление маркеров с JSON на картах google Обработка больших файлов JSON в PHP

Сортировка второго вложенного массива по значению в 3-м с php

Нужно сортировать второй вложенный массив на значение 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, например:

    демонстрация