0

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

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

到目前为止我使用的功能做得很好,但有时会搞砸,这当然是因为它使用了 strcmp

function cmp($a, $b) {
            return strcmp($a["distance"], $b["distance"]);
        }
        usort($resultPartner, "cmp");

我用谷歌搜索了很多,但找不到任何适合我的案例。如果可能的话,我想避免foreach声明,因为我读到它可能对大数组有很差的性能。

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

4

2 回答 2

1

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

比较浮动 php 手册时说

从比较函数返回非整数值,例如浮点数,将导致内部强制转换为回调返回值的整数。因此,诸如 0.99 和 0.1 之类的值都将被转换为整数值 0,这将比较这些值是否相等。

所以你必须小心。

看看这个: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 如果距离等于 b 距离返回 0 如果距离大于 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.

于 2013-02-26T11:43:22.420 回答
1

也许以这种方式:

$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);
于 2013-02-26T11:48:43.013 回答