2013-02-26 94 views
0

排序多维数组我有位置数据的多维阵列(例如地址,电话,姓名,..)以及它们的相对距离的某一点为浮点数(例如0.490126084051490.729524394730471.465210134436113.476735354172)。用浮漂

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

我至今使用的功能做了很好的工作,但因为它使用的strcmp

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

我GOOGLE了很多,但找不到我的情况下,任何东西弄乱了一些时间,这是当然的。如果可能的话,我想避免使用foreach声明,因为我认为它的大数组性能可能很差。

你有什么想法/经验,可以给我一个这样的工作功能?谢谢!

+0

它是什么,有时 '搞乱'?我从我用C#的经验中学到了漂浮不太好的数字来比较,你应该检查它们几乎是相同的,而不是完全相同,因为它们相当不准确,这可能可以解释'混乱' – AmazingDreams 2013-02-26 11:41:51

+0

它搞砸了,因为strcmp是一个字符串比较,因此显然不是排序浮点数的正确方法。 ;)但是直到现在我才知道更好.. :) – Sebsemillia 2013-02-26 11:51:14

回答

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.

+0

谢谢!这工作!但有一个问题,你为什么加上'? -1:1'?据我所见,这只能颠倒顺序。我通过转向'<' into '>'也做到了。但我根本不是PHP专家,所以也许你可以向我解释。无论如何谢谢! – Sebsemillia 2013-02-26 11:49:09

+1

@Sebsemillia我编辑它更多,并把它的原因。但是必须做一些增强..编辑。 – iiro 2013-02-26 11:57:57

+0

谢谢!非常感激! – Sebsemillia 2013-02-26 12:05:43

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);