2015-08-10 4 views
1

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

$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 
    )  
) 

ответ

1

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

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

usort($ranked, function($a, $b) { 
    if ($a['day'] === $b['day']) return 0; 

    return ($a['day'] > $b['day']) ? -1 : 1; 
}); 

Вы можете прочитать больше об этой функции here.

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; 
1

Я сделал это с помощью следующего сценария:

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; 
    } 
+0

со ссылкой Вопрос: http://stackoverflow.com/questions/31912344/sort-a-multi-dimensional-array-based-on-an- упорядоченный массив –

Смежные вопросы