2012-07-07 2 views
0

Если предположить, что у меня есть что-то, возвращаясь из запроса JSON, который по существу выглядит следующим образом -Сортировка вложенные массивы с помощью элемента в каждом Sub массива

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

Как заказать его одним из элементов? Скажите, хотел ли я отсортировать весь массив массивов с помощью элемента Lat? И верните его в элемент $data, поэтому я могу продолжать работать с ним.

Я читал материал на PHP около usort и сортировал по элементу sub-array, но когда я пытаюсь работать с их примерами кода, они не работают.

+0

Для того, чтобы этот вопрос звучит менее запутанным, попробуйте называть их вложенные массивы. Просто предложение – DrinkJavaCodeJava

ответ

0

Функция обратного вызова для usort получит две из ваших записей в массиве (которые сами по себе являются массивами) и должна ответить, стоит ли $ a до или после $ b.

Например, функция получит

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

Так что, если вы хотите отсортировать по Lat элементу, можно использовать,

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, чтобы получить отсортированный по-другому).

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); 
Смежные вопросы