1

根据这个答案->基于另一个数组的键对数组进行排序?,我使用此函数对另一个数组进行排序:

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
$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():第一个参数应该是字符串或整数

那么这个问题的任何解决方案?谢谢。

4

2 回答 2

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". 只要您用于排序的索引在数字的上限范围内具有重要数字,它就可以工作,但这不是一种安全的排序方式。

于 2013-06-27T18:31:28.497 回答
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

因此,您的问题的解决方案是将索引限制为整数的最大值。或将浮点数转换为字符串,但我不建议这样做,但遗憾的是,这似乎是实现您想要做的事情的唯一方法。

于 2013-06-27T17:58:23.123 回答