TL; DR:我需要对特定单词的数组进行排序。顺序应该匹配现有的数组。查看最后一个代码块中的示例代码。手动排序数组,比较给定的单词列表
我有一个标题数组,每个标题的第一个字是一种颜色。我习惯于在这个时候对数组进行排序,但这是令人困惑的。
问题:我需要根据已经排序的单词列表来手动排序单词数组。我已经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');
什么是'$ video_categories [belt_id]''中的'belt_id'?不是颜色ID吗?所以你可以按这个排序.. – bitWorking
不,这是一个更大的系统的一部分。皮带ID来自数据库,并且是相当随意的。这个系统是为了排序,如果已经有一些排序正确的话就不会成为问题;) –