Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP按任意顺序排序_Php_Arrays_Sorting - Fatal编程技术网

PHP按任意顺序排序

PHP按任意顺序排序,php,arrays,sorting,Php,Arrays,Sorting,我需要一个php函数来根据任意顺序对单词列表进行排序 列表中任何不符合我预定义顺序的单词都应按字母顺序排列在列表的末尾 下面是我的第一次尝试,既不优雅也不高效。你能建议一个更好的方法来实现这一点吗 谢谢 public static function sortWords(&$inputArray){ $order=array("Banana","Orange", "Apple", "Kiwi"); sort($inputArray); for($i=0;$i<

我需要一个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;
        }
    }
}
公共静态函数sortWords(&$inputArray){
$order=数组(“香蕉”、“橘子”、“苹果”、“猕猴桃”);
排序($inputArray);
对于($i=0;$i)

尚未测试,但请尝试此操作。

可能比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;
}
函数sortWordsCmp($a,$b){
$order=数组(“香蕉”、“橘子”、“苹果”、“猕猴桃”);
$a=数组搜索($a,$order);
$b=数组搜索($b,$order);
如果($a==$b)
返回0;
返回($b==false)|($a<$b))?-1:+1;
}
公共静态函数sortWords($inputArray){
usort($inputArray,'sortWordsCmp');
返回$inputArray;
}
PHP提供了和函数,允许您编写自己的排序例程。在这两个例程中,您需要
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;
}
函数mycompare($a,$b){
如果($a==$b){返回0;}
$order=数组(“香蕉”、“橘子”、“苹果”、“猕猴桃”);
$position=数组搜索($a,$order);
$position2=数组搜索($b,$order);
//如果两者都在$order中,则根据它们在$order中的顺序进行排序。。。
如果($position2!==false&&$position!==false){返回($position<$position2)?-1:1;}
//如果只有一个在$order中,则排序以首先将其放入$order中。。。
如果($position!==false){return-1;}
如果($position2!==false){返回1;}
//如果两者都不是按$order排序,那么简单的字母排序。。。
回报率($a<$b)?-1:1;
}
…然后只需调用
usort($inputarray,'mycompare');
对它们进行排序

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']);

无论您的具体用例是什么,您都可以轻松地对其进行重构。

您可以先对两个列表进行排序(NlogN+MlogM时间),然后遍历列表以查找匹配项(N+M时间)。由于您必须进行排序,因此这是最佳的。我知道这与您的问题无关,但您在
for
语句中有一个错误,两个右括号而不是
$iI已对其进行了编辑,如果不起作用,请再试一次。什么是
$sort\u array
?哦,我搞砸了。
// 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']);