Intereting Posts
Функция mime_content_type () не работает включить класс Jfactory во внешний php-файл, Joomla Какая библиотека лучше всего разбирает файлы Excel в PHP? PHP Предотвратить xss Получить только имя файла из url в php без каких-либо значений переменных, которые существуют в URL-адресе Weird PHP error: «Невозможно использовать возвращаемое значение функции в контексте записи» Как определить разницу между обновлением страницы и закрытием страницы Лучшее место для хранения больших объемов данных сеанса IIS 7 / PHP 5.3.6 Разрешения, разрешенные при доступе к сетевому файлу Search_array во вложенных массивах Как загрузить все изображения галереи на сервер в Android? Вставить в mysql, используя форму php / html – не работает Несколько запросов в MQL на Freebase Имеет ли значение, следует ли вызывать exit после заголовка («Location:»)? Как настроить пользовательские заголовки для отдельных действий контроллера в ZF2?

Сортировка многомерного массива по заданным индексам – PHP?

У меня есть два массива $days_order и $mysql_result , я хочу отсортировать массив $days_order используя массив $days_order . Я хочу показать результат MySQL в порядке возрастания по дням? Есть ли способ сделать это или любым другим способом, чтобы я мог передать $days_order в MySQL-запросе в разделе OrderBy ?

 $days_order = Array([0] => 2[1] => 3[2] => 4[3] => 5 [4] => 6[5] => 7[6] => 1); $mysql_result = Array ( [0] => Array ( [hashtag] => a7e87329b5eab8578f4f1098a152d6f4 [title] => Flower [day] => 3 ) [1] => Array ( [hashtag] => b24ce0cd392a5b0b8dedc66c25213594 [title] => Free [day] => 2 ) [2] => Array ( [hashtag] => e7d31fc0602fb2ede144d18cdffd816b [title] => Ready [day] => 1 ) ) 

Я хочу отсортированный массив в $days_order

Вывод:

  Array ( [0] => Array ( [hashtag] => b24ce0cd392a5b0b8dedc66c25213594 [title] => Free [day] => 2 ) [1] => Array ( [hashtag] => a7e87329b5eab8578f4f1098a152d6f4 [title] => Flower [day] => 3 ) [2] => Array ( [hashtag] => e7d31fc0602fb2ede144d18cdffd816b [title] => Ready [day] => 1 ) ) 

Используйте usort с пользовательской функцией сравнения.

Что-то вроде:

 usort($ranked, function($a, $b) { if ($a['day'] === $b['day']) return 0; return ($a['day'] > $b['day']) ? -1 : 1; }); 

Подробнее об этой функции вы можете прочитать здесь .

Вы можете use настраиваемый массив заказов в функции сравнения usort следующим образом:

 usort($mysql_result, function ($a, $b) use ($days_order) { // Then check the position of the 'day' value of each element // against the position of that value in $days_order. $a = array_search($a['day'], $days_order); $b = array_search($b['day'], $days_order); if ($a < $b) return -1; if ($a == $b) return 0; return 1; }); 

Если вы хотите сделать это в MySQL, просто переместив дни вперед, как это, вы можете использовать

 ORDER BY (`day` + 1) % 7 

Или, если он должен быть более сложным, чем просто перенос дня, вы можете использовать CASE для предоставления определенного порядка (хотя этот CASE делает то же самое):

 ORDER BY CASE WHEN `day` = 2 THEN 0 WHEN `day` = 3 THEN 1 WHEN `day` = 4 THEN 2 WHEN `day` = 5 THEN 3 WHEN `day` = 6 THEN 4 WHEN `day` = 7 THEN 5 WHEN `day` = 1 THEN 6 END; 

Я сделал это, используя следующий скрипт:

 function sort_array_custom_compare($mysql_result,$days_order) { uasort($mysql_result, function($a,$b) use ($days_order){ foreach($days_order as $value){ if($a['day'] == $value){ return 0; break; } if($b['day'] == $value){ return 1; break; } } }); return $mysql_result; }