0

位置データ (住所、電話番号、名前など) と特定のポイントからの相対距離 (0.49012608405149または0.72952439473047または または1.4652101344361など13.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マニュアルは言う

float などの比較関数から非整数値を返すと、コールバックの戻り値の整数への内部キャストが発生します。したがって、0.99 や 0.1 などの値は両方とも整数値 0 にキャストされ、これらの値は等しいものとして比較されます。

ですから注意が必要です。

これを見てください: http://www.cygnus-software.com/papers/comparingfloats/comparingfloats.htm

浮動小数点の計算には多少の不確実性が伴うため、2 つの数値が互いに「近い」かどうかを確認することで、これを許容することができます。

次のようなことを試してください:

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

a 距離が 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 に答える