用浮点数排序多维数组



我有一个多维数组,其中包含位置数据(例如地址,电话,姓名,…)及其与某一点的相对距离作为浮点数(例如0.490126084051490.729524394730471.465210134436113.476735354172)。

现在我需要对这个数组进行排序,使它从距离最近的数据集(0.49012608405149)开始,以距离最远的数据集(13.476735354172)结束。

到目前为止,我使用的函数做得很好,但有时会出错,这当然是由于它使用了strcmp
function cmp($a, $b) {
            return strcmp($a["distance"], $b["distance"]);
        }
        usort($resultPartner, "cmp");

我谷歌了很多,但找不到任何适合我的情况。如果可能的话,我想避免一个foreach语句,因为我读它可以有一个糟糕的性能与大数组。

你有什么想法/经验,能给我一个工作功能吗?谢谢你!

strcmp()二进制安全字符串比较为什么你不比较浮点数?

当比较浮点数时,php手册说

从比较函数返回非整数值,例如Float,将导致回调函数的内部强制转换为整数返回值。因此,像0.99和0.1这样的值都将被强制转换为an0的整数值,它将比较相等的值。

所以你必须小心。

看这个:http://www.cygnus-software.com/papers/comparingfloats/comparingfloats.htm

由于浮点计算涉及到一些不确定性,我们可以试着考虑到这一点,看看两个数字是否"接近"其它.

试试这样写:

function cmpfloat($a, $b) {
 if (abs($a["distance"]-$b["distance"]) < 0.00000001) {
   return 0; // almost equal
 } else if (($a["distance"]-$b["distance"]) < 0) {
   return -1;
 } else {
   return 1;
 }
}

如果比较整数值,下面的函数是好的:

function cmp($a, $b) {
    return $a["distance"] < $b["distance"] ? -1 : ($a["distance"] === $b["distance"] ? 0 : 1);
}

如果距离小于b,则返回-1如果a距离等于b距离返回0如果a距离大于b距离返回1

原因:The comparison function must return an integer less than, equal to, or greater than zero if the first argument is considered to be respectively less than, equal to, or greater than the second.

可能是这样的:

$data = array(
    array('dist' => 0.72952439473047),
    array('dist' => 0.49012608405149),
    array('dist' => 0.95452439473047),
    array('dist' => 0.12952439473047),
);
foreach ($data as $k => $v) {
    $dist[$k]  = $v['dist'];
}
array_multisort($dist, SORT_ASC, $data);

最新更新