在php中基于另一个数组对数组进行排序?

时间:2013-06-27 17:52:56

标签: php arrays sorting

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

所以解决这个问题的方法是什么? 感谢。

2 个答案:

答案 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

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