TL; Мне нужно отсортировать массив конкретных слов. Порядок должен соответствовать существующему массиву. См. Пример кода в последнем блоке кода.Ручная сортировка массива по сравнению с заданным списком слов
У меня есть массив названий, первое слово каждого названия - цвет. Я привык к сортировке массивов на данный момент, но это сбивает с толку.
Проблема: Мне нужно вручную отсортировать массив слов на основе списка слов, которые уже отсортированы. Я uasort
настроен так, что у меня есть следующие две переменные, готовые для сравнения:
// first comparison:
$a_first = strtolower($a_split[0]); // white
$b_first = strtolower($b_split[0]); // blue
// 2nd comparison:
$a_first = strtolower($a_split[0]); // purple
$b_first = strtolower($b_split[0]); // white
// 3rd comparison:
$a_first = strtolower($a_split[0]); // blue
$b_first = strtolower($b_split[0]); // purple
Мне нужно сортировать эти цвета от пояса ранжировании, для системы ранжирования джиу-джитсу. Вот массив в правильном порядке:
$color_order = explode(' ', 'white blue purple brown black black-red coral white-red red');
/* $color_order =
Array (
[0] => white
[1] => blue
[2] => purple
[3] => brown
[4] => black
[5] => black-red
[6] => coral
[7] => white-red
[8] => red
)
Current (incorrect) results:
1. Blue
2. Purple
3. White
Desired results:
1. White
2. Blue
3. Purple
*/
Мой текущий код, который выходит из uasort(), сортировка по алфавиту с STRCMP. Мне нужно заменить strcmp тем, что может сортировать с помощью моего цветового массива. (Fyi, цвета не соответствуют слову, они перемещаются в другой массив, поэтому здесь не требуется проверка ошибок).
// Sort Step 1: Sort belt level by color
// $video_categories[belt_id][term]->name = "White belt example"
function _sort_belt_names($a, $b) {
$a_name = trim($a['term']->name);
$b_name = trim($b['term']->name);
$a_split = explode(' ', $a_name);
$b_split = explode(' ', $b_name);
if ($a_split && $b_split) {
$color_order = explode(' ', 'white blue purple brown black black-red coral white-red red');
// IMPORTANT STUFF BELOW! ----
$a_first = strtolower($a_split[0]); // purple
$b_first = strtolower($b_split[0]); // white
// Compare $a_first $b_first against $color_order
// White should come first, red should come last
// Return -1 (early), 0 (equal), or 1 (later)
// IMPORTANT STUFF ABOVE! ----
}
// If explode fails, sort original names alphabetically.
return strcmp($a_name, $b_name);
}
// ---
uasort($video_categories, '_sort_belt_names');
Что такое 'belt_id' в' $ video_categories [belt_id] '? Разве это не идентификатор цвета? Таким образом, вы можете сортировать по этому поводу. – bitWorking
Нет, это часть более крупной системы. Идентификатор пояса из базы данных и является довольно произвольным. Эта система предназначена для сортировки, если бы было уже что-то упорядоченное правильно, тогда это не было бы проблемой;) –