2014-11-27 3 views
1

У меня есть массив, содержащий несколько массивов. Как это:найти и отсортировать массив по наименьшему значению в многомерном массиве

array{ 
    array{ 
     id => 1 
     name => place_1 
     lat => 56.1705 
     lon => 10.2010 
     distance => 1.545 
    } 
    array{ 
     id => 14 
     name => place_14 
     lat => 56.1715 
     lon => 10.2049 
     distance => 1.765 
    } 
    //etc etc 
} 

Мне нужно сортировать массивы в пределах массива на расстоянии, от низкого до высокого - или по крайней мере получить позицию самого низкого расстояния в массиве (например, $array[1][4] == 1.765).

Я уже делал что-то подобное раньше. Тогда я сделал это с помощью функции, как это:

function sort_by_dist($a, $b){ 
    return $a['distance'] - $b['distance']; 
} 
usort($array, 'sort_by_dist'); 

Однако, это будет только в этом случае вернуть bool(true) я понятия не имею, почему он действует таким образом.

Я знаю, что этот вопрос, вероятно, был задан (и ответил) раньше, но, как не говорящий по-английски, я немного не понимаю, что я должен искать.

Благодарим за помощь!

+0

По определению 'usort' будет возвращать логическое значение: http://php.net/manual/en/function.usort.php массив' $ array' будет сортироваться в соответствии с определенной вами функцией (' sort_by_dist') – ymas

ответ

2

Мой ответ только форматирует вашу функцию немного, чтобы сделать его более явным то, что происходит:

$a = array(
    array(
     'id' => 14, 
     'name' => 'place_14', 
     'lat' => 56.1715, 
     'lon' => 10.2049, 
     'distance' => 1.765, 
    ), 
    array(
     'id' => 1, 
     'name' => 'place_1', 
     'lat' => 56.1705, 
     'lon' => 10.2010, 
     'distance' => 1.545, 
    ), 
); 

usort($a, function($a, $b) { 
    $d1 = $a['distance']; 
    $d2 = $b['distance']; 

    if ($d1 == $d2) { 
     return 0; 
    } 
    return ($d1 < $d2) ? -1 : 1; 
}); 

// the array $a is sorted. 
print_r($a); 

Входной массив usort сортируется, usort вернет ложь, если сортировка не удалось, и правда, в противном случае.

+0

Этот человек отлично справился с задачей. спасибо за помощь –

1

Вы можете использовать array_multisort итерируя думал массив так:

function sort_by(&$array, $subkey) { 
    foreach ($array as $subarray) { 
     $keys[] = $subarray[$subkey]; 
    } 
    array_multisort($keys, SORT_ASC, $array); 
} 
sort_by($coords, 'distance');// $coords is now sorted by distance 

$coords ваш многомерный массив.

Смежные вопросы