2017-01-10 8 views
2

Как получить максимальное расстояние от массива ниже. Я получаю ниже вывод, когда я пытаюсь print_r ($ data);Как получить максимальное значение из массива php

Array 
(
    [0] => Array 
     (
      [distance] => 1.7 km 
      [time] => 3 mins 
      [distance_value] => 1720 
      [time_value] => 192 
     ) 

    [1] => Array 
     (
      [distance] => 4.2 km 
      [time] => 10 mins 
      [distance_value] => 4207 
      [time_value] => 587 
     ) 

) 

ниже мой код..и хочу эхо 4.2 км. Bcoz - это максимальное расстояние в моем массиве.

foreach ($delivery as $key => $value) { 
    if($key==0) { 
     $mysource = $pickup; 
    } else { 
     $mysource = $delivery[$key-1]; 
    } 
    $data[$key] = $this->GetDrivingDistance($mysource,$value); 
    if(!empty($data[$key])) { 
     $dist += max($data[$key]['distance']); 
    } 
} 
echo $dist; exit(); 
print_r($data); exit(); 
+0

Вы хотите найти максимальную дистанцию? –

+0

Является ли это значение 1,7 км или 1,7? – Deep

+0

@ Все ответчики, будьте осторожны, что '4.2 km' - это строка, а не float. Слепое преобразование дает непредсказуемый результат! Сначала вам нужно преобразовать его соответствующим образом. Проверьте мой [ответ] (http://stackoverflow.com/a/41561604/5447994) – Thamilan

ответ

0

я получаю решение снизу код ..

foreach ($delivery as $key => $value) { 
         if($key==0){ 
          $mysource = $pickup; 
         }else{ 
          $mysource = $delivery[$key-1]; 
         } 
         $data[$key] = $this->GetDrivingDistance($mysource,$value); 
         if(!empty($data[$key])){ 
          $max = '-9999999 km'; //will hold max val 
          $found_item = null; //will hold item with max val; 
          foreach($data as $k=>$v) 
          { 
           if($v['distance']>$max) 
           { 
            $max = $v['distance']; 
            $found_item = $v; 
           } 
          }       
         } 
        } 
        $dist = $max; 
0
<?php 

$array = array 
(
    array 
     (
      "distance" => "1.7 km", 
      "time" => "3 mins", 
      "distance_value" => 1720, 
      "time_value" => 192, 
     ), 

     array 
     (
      "distance" => "4.2 km", 
      "time" => "10 mins", 
      "distance_value" => 4207, 
      "time_value" => 587, 
     ) 
); 

$distance = []; 
$i = 0; 
foreach ($array as $distance_data) { 
    $distance[] = (float)$distance_data["distance"]; 
    $i++; 
} 
$max_distnace = max($distance); 
var_dump($max_distnace); 
+0

Вы уверены, что тестировали свой код с динамическими значениями? – Thamilan

0

Вы можете сначала отсортировать массив по расстоянию и получить требуемый один:

$myArray = 
array (
    array 
     (
      'distance' => '1.7 km', 
      'time' => '3 mins', 
      'distance_value' => 1720, 
      'time_value' => 192, 
     ), 
    array 
     (
      'distance' => '4.2 km', 
      'time' => '10 mins', 
      'distance_value' => 4207, 
      'time_value' => 587, 
     ) 

); 

usort($myArray,function($a, $b) { 
return $b['distance_value'] - $a['distance_value']; 
}); 

$maxDistance = $myArray[0]; 

echo $maxDistance['distance']; 
// 4.2 km 
+1

Если вы отмените сравнение usort, вам не потребуется array_reverse 'usort ($ data, function ($ a, $ b) {return $ b ['distance_value'] - $ a ['distance_value'];});' и 'echo $ data [0] ['distance'];'. Вот [демонстрация] (https://eval.in/712928) – bansi

+0

Вы уверены, что протестировали свой код с динамическими значениями? – Thamilan

+0

'distance' и' distance_value' сохраняют одно и то же значение. Думаю, использование 'distance_value' для сравнения более стабильного пути. Этот код проверен. – Ulugov

6

Вы можете использовать встроенные функции:

echo max(array_map('floatval',array_column($array, "distance")))." km"; 

Пояснение:

  • array_column - преобразует ваш массив в одномерный
  • array_map - Применить операцию с плавающей точкой в ​​строку. Это важно, так как сравнение строк сравнивает два числа ошибочно. Когда применяется функция float, ваш km будет удален, поэтому добавьте позже.

Пример строки:

11,7 меньше, чем 4,2, так как он сравнивает первый символ и организует по 1,2,3 ...


Выход:

4.2 km 

Примечание: Это подходит, если все значения указаны в km, если они находятся в других единицах, вам также необходимо обходное решение!

+0

лучший ответ с хорошим объяснением +1 –

0

Thamilan's answer является лучшим, но, как вы используете CakePHP вы можете также использовать Hash::extract() если array_column() не доступен для вас (т.е. вы» повторно использует старую версию PHP), или если вам нужно использовать массив с более глубокими ассоциациями благодаря синтаксису пути в Hash утилиты: -

echo max(array_map('floatval', Hash::extract($array, 'distance'))) . ' km'; 

Здесь Hash::extract() я s работает как array_column() и преобразует ваш массив в одномерный массив.

0

Sine этих вопросов помечаются CakePHP я, хотя я бы отдал свое решение с помощью CakePHP Collection class:

use Cake\Collection\Collection; 
(new Collection($data))->sortBy('distance_value')->first()['distance']; 

Обратите внимание, что CakePHP имеет функцию полезности collection, что может сделать это короче:

collection($data)->sortBy('distance_value')->first()['distance'] 
Смежные вопросы