0

I have an array like this:

Array
(
[0] => Array
    (
        [ID] => 85597
        [DISTANCE] => 14916.204333483
    )

[1] => Array
    (
        [ID] => 85598
        [DISTANCE] => 71.712470188284
    )

[2] => Array
    (
        [ID] => 85599
        [DISTANCE] => 14130.470174227
    )

[3] => Array
    (
        [ID] => 85600
        [DISTANCE] => 14917.670508146
    )

)

I want to return the [ID] of the lowest [DISTANCE].

I tried with min(), but that only seems to compare the [ID] values.

Any idea?

  • 6
    What about simple `foreach`? – sectus Nov 01 '13 at 00:45
  • if these are straight out of a database, use its query language to get the min, not php... ya know... if... – zamnuts Nov 01 '13 at 00:48
  • possible duplicate of [min and max in multidimensional-array](http://stackoverflow.com/questions/4497810/min-and-max-in-multidimensional-array) – hwnd Nov 01 '13 at 01:06

3 Answers3

1
$min = PHP_INT_MAX;
foreach($array as $value){
    if($value['DISTANCE'] < $min){
        $minId = $value['ID'];
        $min = $value['DISTANCE'];
    }
}

$minId will be id with the lowest distance

user1588740
  • 131
  • 10
0

Try something like:

foreach($array as $a){
  $newArray[$a['ID']] = $a['DISTANCE'];
}
$min = min(array_values($newArray));
function showId($least){
  foreach($newArray as $i => $v){
    if($least === $v){
      return $i;
    }
  }
}
echo showId($min);
StackSlave
  • 10,613
  • 2
  • 18
  • 35
0

Think this will make you happy :-)

    $data = array(
        array('id' => 1, 'distance' => rand(1,100000)),
        array('id' => 2, 'distance' => rand(1,100000)),
        array('id' => 3, 'distance' => rand(1,100000)),
        array('id' => 4, 'distance' => rand(1,100000)),
        array('id' => 5, 'distance' => rand(1,100000)),
        array('id' => 6, 'distance' => rand(1,100000)),
        array('id' => 7, 'distance' => rand(1,100000)),
        array('id' => 8, 'distance' => rand(1,100000)),
    );

    echo "--raw data--\n";

    var_dump($data);

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

    usort($data, 'distanceSorter');

    echo "--sorted data--\n";

    var_dump($data);

    echo "--grab first result ( lowest )--\n";

    var_dump($data[0]);


    GIVES

    --raw data--
    array(8) {
        [0]=>
      array(2) {
            ["id"]=>
        int(1)
        ["distance"]=>
        int(27573)
      }
      [1]=>
      array(2) {
            ["id"]=>
        int(2)
        ["distance"]=>
        int(93357)
      }
      [2]=>
      array(2) {
            ["id"]=>
        int(3)
        ["distance"]=>
        int(84515)
      }
      [3]=>
      array(2) {
            ["id"]=>
        int(4)
        ["distance"]=>
        int(13666)
      }
      [4]=>
      array(2) {
            ["id"]=>
        int(5)
        ["distance"]=>
        int(11810)
      }
      [5]=>
      array(2) {
            ["id"]=>
        int(6)
        ["distance"]=>
        int(37548)
      }
      [6]=>
      array(2) {
            ["id"]=>
        int(7)
        ["distance"]=>
        int(10705)
      }
      [7]=>
      array(2) {
            ["id"]=>
        int(8)
        ["distance"]=>
        int(73548)
      }
    }
    --sorted data--
    array(8) {
        [0]=>
      array(2) {
            ["id"]=>
        int(7)
        ["distance"]=>
        int(10705)
      }
      [1]=>
      array(2) {
            ["id"]=>
        int(5)
        ["distance"]=>
        int(11810)
      }
      [2]=>
      array(2) {
            ["id"]=>
        int(4)
        ["distance"]=>
        int(13666)
      }
      [3]=>
      array(2) {
            ["id"]=>
        int(1)
        ["distance"]=>
        int(27573)
      }
      [4]=>
      array(2) {
            ["id"]=>
        int(6)
        ["distance"]=>
        int(37548)
      }
      [5]=>
      array(2) {
            ["id"]=>
        int(8)
        ["distance"]=>
        int(73548)
      }
      [6]=>
      array(2) {
            ["id"]=>
        int(3)
        ["distance"]=>
        int(84515)
      }
      [7]=>
      array(2) {
            ["id"]=>
        int(2)
        ["distance"]=>
        int(93357)
      }
    }
    --grab first result ( lowest )--
    array(2) {
        ["id"]=>
      int(7)
      ["distance"]=>
      int(10705)
    }

Short version

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

usort($data, 'distanceSorter');

// if you really just want the lowest value

$lowestDistance = array_shift(usort($data, 'distanceSorter');
wtfzdotnet
  • 1,022
  • 8
  • 11