以Coanda链接中的信息为起点,可以清楚地看到PHP在比较不同类型的对象时使用了类型转换。问题在于理解在比较过程中将什么转换为什么,我还没有找到完整的列表,但通常情况下:
字符串与整数进行比较时会被转换为
(int) string <,>,=, (int) int
在这种情况下,将字符串转换后变为0,因此所有的整数都大于一个字符串。(预期的结果)。这是我们需要关心的唯一情况,以进行此排序。
PHP使用快速排序,并且很可能选择其轴点作为
array[n/2]
,其中n是数组中元素的数量。知道这两个信息后,我们对上述数组进行快速排序:
$pivot = $array[n/2] //n is the number of elements, this sets $pivot='img2'
//compare each element in the list (i am going to this by hand for demonstration)
(int) 'img2' < 2 //int to int comparison;'img2' resolves to 0 and 0 < 2
(int) 'img2' < 1 //int to int comparison;'img2' resolves to 0 and 0 < 1
'img2' > 'img1' // string to string comparison; strcmp is +256
'img2' > 'img 10' //string to string comparison; strcmp is +256
(float) 'img2' < 1.5 //float to float comparison;'img2' resolves to 0 and 0<1.5
'img2' > '3.14' //string to string comparison; strcmp is +54
'img2' > '2.72' //string to string comparison; strcmp is +55
我们现在有两个新数组(一个用于大于,一个用于小于)。
$greater = array('img1', 'img10', '3.14', '2.72);
$less = array(2, 1, 1.5);
现在我们不需要进一步详细说明,因为我们无意中创建了两个包含所有容易比较对象的数组。
$greater
只有字符串,我们可以假设排序在此处正常工作,并将所有内容视为字符串。
sort($greater);
var_dump($greater);
产生
array(4) {
[0]=>
string(5) "2.72"
[1]=>
string(4) "3.14"
[2]=>
string(4) "img1"
[3]=>
string(5) "img10"
}
这正是我们预期的结果,也是上面的结果。我们对$lesser
执行相同的操作。
$lesser = array(2, 1, 1.5);
sort($lesser);
var_dump($lesser);
我们将会获得以下内容:
array(3) {
[0]=>
int(1)
[1]=>
float(1.5)
[2]=>
int(2)
}
这也是预期的。现在,当我们将这三个数组连接在一起时(出于递归的目的,我将“img2”称为一个数组),我们得到了上面的结果。
Array
(
[0] => 2.72
[1] => 3.14
[2] => img1
[3] => img10
[4] => img2
[5] => 1
[6] => 1.5
[7] => 2
)
为了证明这一点,您可以按照相同的过程处理此相同的数组,但将
$arr[3]
替换为一个整数。
$arr = array("img2", 1, "img1", 2, "img10", 1.5, "3.14", "2.72");
sort($arr);
var_dump($arr)
由于数据透视表中的数据类型从字符串变成了整数,因此导致浮点字符串被解释为浮点数,从而得出完全不同的结果。
array(8) {
[0]=>
string(4) "img1"
[1]=>
string(5) "img10"
[2]=>
string(4) "img2"
[3]=>
int(1)
[4]=>
float(1.5)
[5]=>
int(2)
[6]=>
string(4) "2.72"
[7]=>
string(4) "3.14"
}
SORT_NUMERIC
标志 http://php.net/sort - PekkaSORT_REGULAR
,排序是如何执行的。SORT_REGULAR是什么意思?排序规则如何为排序结果中的项目分配优先级? - Daric