php中的array_multisort是如何工作的?

5

我有些难以理解array_multisort。

当两个值相同时,看看它是如何排序的:

 $a1=array("Dog","Dog","Cat");
 $a2=array("Pluto","Fido","Missy");
 array_multisort($a1,$a2);
 print_r($a1);
 print_r($a2);

上面代码的输出结果将会是:
 Array ( [0] => Cat [1] => Dog [2] => Dog )
 Array ( [0] => Missy [1] => Fido [2] => Pluto )

请告诉我为什么Missy排在第一位,如果按升序排序,结果应该是 Array ( [0] => Fido, [1] => Missy, [2] => Pluto ) 如果按降序排序,则相反。

另外,请查看以下内容:

带有排序参数:

$a1=array("Dog","Dog","Cat");
$a2=array("Pluto","Fido","Missy"); 
array_multisort($a1,SORT_ASC,$a2,SORT_DESC); 
print_r($a1); 
print_r($a2);

上述代码的输出结果将会是:
 Array ( [0] => Cat [1] => Dog [2] => Dog ) 
 Array ( [0] => Missy [1] => Pluto [2] => Fido )

但是,数组 ( [0] => Missy [1] => Pluto [2] => Fido ) 在未按 SORT_DESC 排序时有些混乱。

有人可以解释一下数组多重排序如何工作,以便我可以理解它的工作原理。

3个回答

11

嗯,你正在以类似于Excel的程序方式对数组进行排序。每个数组对应一列。

首先,所有数组都按照给定的第一个数组进行排序。如果存在相同的值,则按照给定的第二个数组进行排序。如果再次存在相等的值,则使用第三个数组,依此类推。

换句话说:使用所有数组对数组进行排序,但是从右边开始(如果假设它确实只对所有列进行一次排序)。

对于你的特定示例(第二个示例):

首先,你想按升序排序,所以Cat将排在第一位。因此,两个数组中的最后一个元素将移动到第一位置。另外两个元素Dog相等。这导致函数查看下一个数组。它被告知按降序排序此数组,因此Pluto排在第一位。在这种情况下,这导致元素根本不会移动(因为它们的顺序已经正确)。


哦,所以只有第一个是缩短的,第二个只是重新排列它的元素,按照第一个相同的顺序,第一个替换了它的元素来缩短。 - php.khan
没错。所有的数组都使用相同的顺序进行排序。它不是用来保存多次调用 sort() 的。 - Mario

2
第二个数组中的条目对应于第一个数组中相同的条目。

2
如果您查看文档和第一个示例,您会注意到这是预期的行为。
使用两个参数,都是数组:第一个数组被排序;如果第一列中对应的值相同,则第二个数组将重新排列并排序其对应的值。至于您的示例,请将其视为执行SQL ORDER BY Animal, Name
  1. 猫排在第一位
  2. 两只狗打成平局,所以Fido排在第一位,因为Fido < Pluto

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接