Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/spring-boot/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 用浮点数对多维数组排序_Php_Sorting_Multidimensional Array_Floating Point - Fatal编程技术网

Php 用浮点数对多维数组排序

Php 用浮点数对多维数组排序,php,sorting,multidimensional-array,floating-point,Php,Sorting,Multidimensional Array,Floating Point,我有一个多维数组,其中包含位置数据(例如地址、电话、姓名等)及其与某个点的相对距离(例如0.49012608405149或0.72952439473047或1.4652101344361或13.4767354172) 现在,我需要对该数组进行排序,使其以最近距离的数据集(0.49012608405149)开始,以最远距离(13.4767354172)结束 到目前为止,我使用的函数做得很好,但有时会出错,这当然是因为它使用strcmp function cmp($a, $b) {

我有一个多维数组,其中包含位置数据(例如地址、电话、姓名等)及其与某个点的相对距离(例如
0.49012608405149
0.72952439473047
1.4652101344361
13.4767354172

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

到目前为止,我使用的函数做得很好,但有时会出错,这当然是因为它使用strcmp

function cmp($a, $b) {
            return strcmp($a["distance"], $b["distance"]);
        }
        usort($resultPartner, "cmp");
我在谷歌上搜索了很多,但都找不到我的案子。如果可能的话,我希望避免使用
foreach
语句,因为据我所知,在使用大数组时,它的性能可能会很差

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

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

当比较浮动时,php手册说

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

所以你必须小心

看看这个:

由于浮点计算包含一些不确定性,我们可以 通过查看两个数字是否彼此“接近”,尝试考虑到这一点 其他的

试着这样做:

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;
 }
}
函数cmpfloat($a,$b){
如果(绝对值($a[“距离”]-$b[“距离”])<0.00000001){
返回0;//几乎相等
}如果($a[“距离”]-$b[“距离”])小于0{
返回-1;
}否则{
返回1;
}
}
如果比较整数值,以下函数很好:

function cmp($a, $b) {
    return $a["distance"] < $b["distance"] ? -1 : ($a["distance"] === $b["distance"] ? 0 : 1);
}
函数cmp($a,$b){
返回$a[“距离”]<$b[“距离”]?-1:($a[“距离”]===$b[“距离”]?0:1);
}
如果a距离小于b距离,则返回-1 如果a距离等于b距离,则返回0 如果a距离大于b距离,则返回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);

什么东西有时会“搞砸”?我从我使用C#的经验中了解到,浮点数不是很好的比较数字,你应该检查它们是否“几乎”相同,而不是“完全”相同,因为它们非常不准确,这可能解释了它所造成的“混乱”,因为strcmp是一种字符串比较,因此显然不是对浮点进行排序的正确方法但直到现在我才知道非常感谢。这个有用!!但有一个问题,你为什么加上“-1 :1' ? 在我看来,这只是颠倒了顺序。我也通过转动“”来实现这一点。但我根本不是php专家,所以也许你可以给我解释一下。无论如何谢谢你@Sebsemillia我编辑了更多,并说明了原因。但是必须做一些改进。。编辑,谢谢!非常感谢!再次感谢您的更新!我还阅读了php手册中关于比较浮点数的内容,但它们没有显示任何替代方案(或者至少我没有找到它们),这就是我在stackoverflow上问这个问题的原因。