根据这个答案 - > Sort an Array by keys based on another Array?,我使用此函数将我的另一个数组排序:
function sortArrayByArray($array,$orderArray) {
$ordered = array();
foreach($orderArray as $key) {
if(array_key_exists($key,$array)) {
$ordered[$key] = $array[$key];
unset($array[$key]);
}
}
return $ordered + $array;
}
首先,我有这样的代码并且工作正常
$array1 = array("a","b","c");
$array2 = array("2","5","1");
$array3 = array("2","5","1");
rsort($array3); //5,2,1
for($i=0;$i<3;$i++){
$customer1[$array2[$i]] = $array1[$i];
}
$properOrderedArray1 = sortArrayByArray($customer1, $array3);
print_r($properOrderedArray1);
但是当我使用像multiply这样的逻辑数学时,它会得到任何错误,就像它说有数据类型float
//multiply
$a = 100000*100000;
$b = 200000*200000;
$c = 300000*300000;
$array1 = array("a","b","c");
$array2 = array($a,$b,$c);
$array3 = array($a,$b,$c);
rsort($array3); //5,2,1
for($i=0;$i<3;$i++){
$customer1[$array2[$i]] = $array1[$i];
}
$properOrderedArray1 = sortArrayByArray($customer1, $array3);
print_r($properOrderedArray1);
var_dump($array2);
错误:警告:array_key_exists():第一个参数应该是字符串或整数
所以解决这个问题的方法是什么? 感谢。
答案 0 :(得分:1)
如上所述,您必须将浮动转换为字符串。我想你可以改变你的功能,使其成功:
function sortArrayByArray($array,$orderArray) {
$ordered = array();
foreach($orderArray as &$key) {
if (!is_int($key))
$key = number_format($key,0,'.','');
if(array_key_exists($key,$array)) {
$ordered[$key] = $array[$key];
unset($array[$key]);
}
}
return $ordered + $array;
}
以这种方式执行此操作的问题是您的浮点值会丢失精度。在64位系统中所有这些值
$a = 9223372036854775808;
$b = 9223372036854775809;
$c = 9223372036854775810;
将转换为相同的float(9.2233720368548E+18)
,并将其转换为字符串将为string(19) "9223372036854775808"
。只要您用于排序的索引在数字的上限范围内有大量数字就可以工作,但这不是一种安全的排序方式。
答案 1 :(得分:0)
基本上我在评论中写的是真实的,因为我刚刚在手册中查到:http://php.net/manual/en/language.types.integer.php
$large_number = 2147483647; //treated as int
$large_number = 2147483648; //treated as float since it is too large for an integer
因此,您的问题的解决方案是将索引限制为整数的最大值。 或者将浮点数转换为字符串,但我不建议这样做,但遗憾的是,这似乎是实现你想要做的事情的唯一方法。