Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.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 唯一十六进制数的sort()数组(字符串类型):意外结果_Php_Arrays_String_Sorting_Hex - Fatal编程技术网

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

我需要一个十六进制数的排序数组。(在本例中,我将128位数字编码为32字节的十六进制字符串:这些是IP地址,以_addr形式转换为二进制,然后转换为十六进制:IPv4地址前面加了“:”以提供单个地址空间。)使用PHP内置的“sort()进行排序函数在某些值上产生意外结果:

$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标志!是的,这通常是必要的——而且不仅仅是为了可读性。)我已经添加了解释。