0

基本的に次のような JSON リクエストから返される何かがあると仮定します -

$data = array('0'=> array('name' => 'Dr. Smith',
                          'address' => '3002 Fake Ave.',
                          'lat' => '34.711158',
                          'lng' => '-137.803578',
                          'phone' => '714.939.1324'),
              '1' => array('name' => 'Dr. Paul',
                           'address' => '801 Fake St.',
                           'lat' => '31.749917',
                           'lng' => '-137.834388'));

要素の 1 つで並べ替えるにはどうすればよいですか? Lat配列の配列全体を要素で並べ替えたいとしますか? $dataそして、それを要素に戻して、作業を続けることができます。

PHP に関するものを読み、usortサブ配列要素で並べ替えましたが、コード例を操作しようとすると、機能しません。

4

2 に答える 2

0

usort のコールバック関数は、2 つの配列エントリ (それ自体が配列です) を受け取り、$a が $b の前または後に来るかどうかに応答する必要があります。

たとえば、関数は受け取る

  $a = array('Lat' => 45, 'Name' => 'Mickey Mouse', ...)
  $b = array('Lat' => 47, ...)

したがって、緯度要素で並べ替えたい場合は、次のように使用します。

  function sort_by_lat($a, $b)
  {
      return $a['Lat'] - $b['Lat']; // or b - a to sort the other way
  }

  usort($array, "sort_by_lat");

このように、経度でソートすると、-1 は +1 未満、-179 は +180 未満と見なされる可能性があるという問題が発生する可能性があります。あなたが期待するものかもしれませんし、そうでないかもしれません。この場合、if() を使用するか、何らかの変換を導入する必要があります。

名前で並べ替えるには、次のことができます

 if ($a['field'] > $b['field']) return 1;
 if ($a['field'] == $b['field']) return 0;
 return -1;

(もう一度 +1 と -1 を逆にして、逆に並べ替えます)。

于 2012-07-07T01:03:25.300 に答える
0

すべてのデータが文字列として入ってくることを忘れないでください。適切な比較を行うには、数値を浮動小数点数に変換する必要があります。

http://codepad.org/p2EMfTDR

$data = array('0'=> array('name' => 'Dr. Smith', 'address' => '3002 Fake Ave.', 'lat' => '20.711158', 'lng' => '10.803578', 'phone' => '714.939.1324'), '1' => array('name' => 'Dr. Paul', 'address' => '801 Fake St.', 'lat' => '10.749917', 'lng' => '20.834388'));

function cmpLat($a, $b)
{
    if(floatval($a['lat']) > floatval($b['lat'])) {
        return 1;
    } elseif(floatval($a['lat']) < floatval($b['lat'])) {
        return -1;
    } else {
        return 0;
    }
}

function cmpLng($a, $b)
{
    if(floatval($a['lng']) > floatval($b['lng'])) {
        return 1;
    } elseif(floatval($a['lng']) < floatval($b['lng'])) {
        return -1;
    } else {
        return 0;
    }
}

usort($data, "cmpLat");

print_r($data);

usort($data, "cmpLng");

print_r($data);
于 2012-07-07T01:10:47.247 に答える