我有一个多维数组,其中包含位置数据(例如地址,电话,名称......)以及它们与某个点的相对距离(如0.49012608405149
或0.72952439473047
或{{1} }或1.4652101344361
)。
现在我需要对此数组进行排序,使其以最近距离(13.476735354172
)的数据集开始,并以最远的(0.49012608405149
)结束。
到目前为止我使用的功能做得很好,但是有些时候会搞乱,这当然是因为它使用了strcmp
13.476735354172
我google了很多但是找不到我的情况。如果可能的话,我想避免使用function cmp($a, $b) {
return strcmp($a["distance"], $b["distance"]);
}
usort($resultPartner, "cmp");
语句,因为我读到它可能会在大数组中表现不佳。
你对此有什么想法/经验,能为我提供一个有效的功能吗?谢谢!
答案 0 :(得分:1)
strcmp()
是二进制安全字符串比较为什么你不只是比较浮点数?
比较浮动php手册说
从比较函数返回非整数值,例如 float,将导致内部强制转换为回调的整数 回报价值。因此,诸如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.
答案 1 :(得分: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);