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。(仅供参考,颜色与单词不匹配,它们被移动到不同的数组 - 所以我不需要在这里进行错误检查)。
// 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' );