我需要php中的一个函数来根据任意顺序对单词列表进行排序。
列表中不以预定义顺序排列的任何单词都应按字母顺序排在列表末尾。
以下是我的第一次尝试,既不优雅也不高效。你能建议一个更好的方法来实现这个目标吗?
由于
public static function sortWords(&$inputArray){
$order=array("Banana","Orange", "Apple", "Kiwi");
sort($inputArray);
for($i=0;$i<count($inputArray));$i++){
$ac = $inputArray[$i];
$position = array_search($ac,$order);
if($position !== false && $i != $position){
$temp=$inputArray[$position];
$inputArray[$position]=$inputArray[$i];
$inputArray[$i]=$temp;
}
}
}
答案 0 :(得分:12)
PHP提供了usort()
和uksort()
函数,允许您编写自己的排序例程。在这两个中,你会想要usort()
。
这两个函数都希望您编写一个独立函数,它将输入数组的两个元素作为输入,并返回它们应该排序的顺序。 usort()
函数然后运行它自己的排序算法,调用你的函数,以便经常根据需要建立排序顺序,直到它对整个数组进行排序。
所以你要写这样的东西......
function mycompare($a, $b) {
if ($a == $b) {return 0;}
$order=array("Banana","Orange", "Apple", "Kiwi");
$position = array_search($a,$order);
$position2 = array_search($b, $order);
//if both are in the $order, then sort according to their order in $order...
if ($position2!==false && $position!==false) {return ($position < $position2) ? -1 : 1;}
//if only one is in $order, then sort to put the one in $order first...
if($position!==false) {return -1;}
if($position2!==false) {return 1;}
//if neither in $order, then a simple alphabetic sort...
return ($a < $b) ? -1 : 1;
}
...然后只需致电usort($inputarray,'mycompare');
对其进行排序。
答案 1 :(得分:1)
public static function sortWords($inputArray){
$order=array("Banana","Orange", "Apple", "Kiwi");
$sorted_array = array_diff($inputArray,$order);
sort($sorted_array);
$rest_array = array_intersect($order,$inputArray);
$result = array_merge($rest_array,$sorted_array);
return $result;
}
尚未测试,但试试这个。
答案 2 :(得分:1)
可能比Headshota的解决方案慢,但仅为您提供另一种(未经测试的)可能性:
function sortWordsCmp($a, $b) {
$order=array("Banana","Orange", "Apple", "Kiwi");
$a = array_search($a, $order);
$b = array_search($b, $order);
if ($a === $b)
return 0;
return (($b===false) || ($a < $b)) ? -1 : +1;
}
public static function sortWords($inputArray){
usort($inputArray, 'sortWordsCmp');
return $inputArray;
}
答案 3 :(得分:0)
public static function sortByArbitraryKeys(&$inputArray, $sort_order) {
$sort_order = array_flip($sort_order);
uksort($inputArray, function ($a, $b) use ($sort_order) {
return $sort_order[$a] - $sort_order[$b];
}
}
以下是一个例子......
// Doe, John L.
$this->full_name = ['last_name'=>'Doe', 'first_name'=>'John', 'middle_initial'=>'L.'];
// John L. Doe
$this->sortByArbitraryKeys($this->full_name, ['first_name', 'middle_initial', 'last_name']);
无论您的具体用例如何,您都可以轻松地重构此内容。