У меня есть два массива $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; }