Php 唯一十六进制数的sort()数组(字符串类型):意外结果
我需要一个十六进制数的排序数组。(在本例中,我将128位数字编码为32字节的十六进制字符串:这些是IP地址,以_addr形式转换为二进制,然后转换为十六进制:IPv4地址前面加了“:”以提供单个地址空间。)使用PHP内置的“sort()进行排序函数在某些值上产生意外结果:Php 唯一十六进制数的sort()数组(字符串类型):意外结果,php,arrays,string,sorting,hex,Php,Arrays,String,Sorting,Hex,我需要一个十六进制数的排序数组。(在本例中,我将128位数字编码为32字节的十六进制字符串:这些是IP地址,以_addr形式转换为二进制,然后转换为十六进制:IPv4地址前面加了“:”以提供单个地址空间。)使用PHP内置的“sort()进行排序函数在某些值上产生意外结果: $test=array(); $test[]="00000000000000000000000005275087"; $test[]="00000000000000000000000005275104"; $test[]="0
$test=array();
$test[]="00000000000000000000000005275087";
$test[]="00000000000000000000000005275104";
$test[]="00000000000000000000000005274E65";
$test[]="00000000000000000000000005274F32";
$test[]="0000000000000000000000000527501C";
\sort($test);
var_dump($test);
→强>
array(5) {
[0]=> string(32) "00000000000000000000000005275087"
[1]=> string(32) "00000000000000000000000005275104"
[2]=> string(32) "00000000000000000000000005274E65"
[3]=> string(32) "00000000000000000000000005274F32"
[4]=> string(32) "0000000000000000000000000527501C"
}
我认为sort()函数中一定有问题,可能是由隐式类型转换(在数组中应用不一致)引起的。但是,作为反对某些单个数组元素被排序为整数或浮点数,而其他元素被排序为字符串的想法的证据(因此我希望结果是稳定的,尽管仍然不符合字符串排序顺序);我发现重新排列初始数组元素会产生不同的结果,而且,引入重复条目可以使sort()函数产生正确的结果
请更全面地解释这一现象,并提出一些优雅的方法来解决这个问题!这是PHP中的一个bug,还是PHP弱类型强制的一个“特性”?我想这两者都有一点。问题是PHP在比较包含数值的字符串时过于友好。引述: 如果将数字与字符串进行比较,或者比较涉及 数字字符串,然后将每个字符串转换为一个数字 进行数值比较
现在考虑一下:
var_dump("5275104" < "5274E65"); // bool(true)
var_dump("5274E65" < "5274F32"); // bool(true)
var_dump("5275104" < "5274F32"); // bool(false) - WHAT?
该标志告诉PHP排序函数应该始终使用比较字符串,而不管字符串中是否有数值。我想这两者都有一点。问题是PHP在比较包含数值的字符串时过于友好。引述: 如果将数字与字符串进行比较,或者比较涉及 数字字符串,然后将每个字符串转换为一个数字 进行数值比较
现在考虑一下:
var_dump("5275104" < "5274E65"); // bool(true)
var_dump("5274E65" < "5274F32"); // bool(true)
var_dump("5275104" < "5274F32"); // bool(false) - WHAT?
该标志告诉PHP排序函数应该始终使用比较字符串,而不管字符串中是否有数值。我想这两者都有一点。问题是PHP在比较包含数值的字符串时过于友好。引述: 如果将数字与字符串进行比较,或者比较涉及 数字字符串,然后将每个字符串转换为一个数字 进行数值比较
现在考虑一下:
var_dump("5275104" < "5274E65"); // bool(true)
var_dump("5274E65" < "5274F32"); // bool(true)
var_dump("5275104" < "5274F32"); // bool(false) - WHAT?
该标志告诉PHP排序函数应该始终使用比较字符串,而不管字符串中是否有数值。我想这两者都有一点。问题是PHP在比较包含数值的字符串时过于友好。引述: 如果将数字与字符串进行比较,或者比较涉及 数字字符串,然后将每个字符串转换为一个数字 进行数值比较
现在考虑一下:
var_dump("5275104" < "5274E65"); // bool(true)
var_dump("5274E65" < "5274F32"); // bool(true)
var_dump("5275104" < "5274F32"); // bool(false) - WHAT?
该标志告诉PHP排序函数应该始终使用比较字符串,而不管字符串中是否有数值。谢谢。从现在起,我将在我的所有排序操作中使用SORT_uu标志!是的,这通常是必要的——而且不仅仅是为了可读性。)我已经添加了解释。谢谢。从现在起,我将在我的所有排序操作中使用SORT_uu标志!是的,这通常是必要的——而且不仅仅是为了可读性。)我已经添加了解释。谢谢。从现在起,我将在我的所有排序操作中使用SORT_uu标志!是的,这通常是必要的——而且不仅仅是为了可读性。)我已经添加了解释。谢谢。从现在起,我将在我的所有排序操作中使用SORT_uu标志!是的,这通常是必要的——而且不仅仅是为了可读性。)我已经添加了解释。