2013-12-06 4 views
0

Это должно быть довольно просто, но мой мозг не может обрабатывать это на данный момент. Надеяться вы можете помочь :)PHP порядок/сортировка массива на основе порядка другого массива

У меня есть массив постов, каждая из которых тег, выглядит примерно так:

Array(
    [0] = Array('Computers', postObject), 
    [1] = Array('Sports', postObject), 
    [2] = Array('Computers', postObject), 
    [3] = Array('Business', postObject) 
) 

Я использовал asort(), который, казалось, чтобы отсортировать сообщения по алфавиту, но теперь мне нужно для сортировки сообщений на основе заданного порядка (хранится в массиве), которые могут иметь дополнительные значения.

Array(
    [0] = 'Sports', 
    [1] = 'Fashion', 
    [2] = 'Business', 
    [3] = 'Computers', 
    [4] = 'Stocks' 
) 

Я ожидаю, что первый массив будет отсортирован, как это:

Array(
    [0] = Array('Sports', postObject), 
    [1] = Array('Business', postObject), 
    [2] = Array('Computers', postObject), 
    [3] = Array('Computers', postObject) 
) 

Я не думаю, что есть простая функция PHP позвонить, пожалуйста, вы можете посоветовать?

ответ

0

Вы можете использовать функцию usort, которая сортирует массив, используя пользовательскую функцию сравнения.

непроверенное решение может быть:

$categories = array_flip($categories); // not needed by original solution 
usort($posts, function($a, $b) use ($categories) { 
    // original solution: 
    // return array_search($a[0], $categories) > array_search($b[0], $categories); 

    // shameless CAP (copy-and-paste) from Mike Brant's answer 
    // actually, performs better, and I hope that he doesn't mind :) 
    return $categories[$a[0]] > $categories[$b[0]]; 

}); 

Это решение применимо для PHP против> = 5.3, так как он использует anonymous functions and closures

Если вы используете PHP < 5.3, вы можете использовать ksort функцию, как это (опять же, непроверенные):

$new_arr = array(); 
$categories = array_flip($categories); 
foreach ($posts as $post) { 
    $new_arr[$categories[$post[0]]] = $post; 
} 
ksort($new_arr); 
+0

«Обеспечить контекст для ссылок ссылки на внешние ресурсы, рекомендуется, но, пожалуйста, добавить контекст вокруг ссылки, так что ваши коллеги пользователи будут иметь некоторое представление о том, что это такое и почему он там. Всегда указывайте наиболее релевантную часть важной ссылки, если целевой сайт недоступен или постоянно отключен ». –

+0

@Stoic, решение usort кажется довольно близким, по какой-то причине оно по-прежнему не соответствует правильному порядку, хотя – sirmdawg

+0

Хм, оба этих решения, ваш новый и микрофоны не выглядят правильно: | – sirmdawg

0

Я хотел бы рассмотреть usort(). Пример:

$array = array(...); // your multi-dimension array to sort 
$sort_order_array = array(...); // your array defining sort order 
$sort_order_array_flipped = array_flip($sort_order_array); 

usort($array, function($a, $b) use ($sort_order_array_flipped) { 
    return $sort_order_array_flipped[$a[0]] > $sort_order_array_flipped[$b[0]]; 
}); 

Обратите внимание, что я щелкнул массив порядок сортировки в состоянии сделать его легко для поиска значения порядка (0, 1, 2) на основе значения, сохраненного в главном массиве. Это на самом деле computationaly быстрее, чем делать ключевой цикл с каждой итерации usort()

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