4

See array for example: here

Basically, I want to find the max() for array[]['time'] in that array. I can figure it out if I loop through it, but I was hoping there was a more elegant solution.

S16
  • 2,963
  • 9
  • 40
  • 64
  • possible duplicate of [Get the maximum value from an element in a multidimensional array?](http://stackoverflow.com/questions/2189479/get-the-maximum-value-from-an-element-in-a-multidimensional-array) – John Carter Mar 17 '12 at 12:10

3 Answers3

10

Think array_reduce if you want to compute some single value iteratively over an array:

$max = array_reduce($array, function($a, $b) { 
  return $a > $b['time'] ? $a : $b['time']; 
} );

Or you could make use of a utility function like:

function array_col(array $a, $x)
{
  return array_map(function($a) use ($x) { return $a[$x]; }, $a);
}

which would be used like:

$max = max(array_col($array, 'time'));

It's more general purpose and could be used for other similar things.

Matthew
  • 47,584
  • 11
  • 86
  • 98
  • Couldn't you use PHP's built in `array_column` function instead of your `array_col` function? http://php.net/manual/en/function.array-column.php – Ethan Dec 24 '16 at 07:43
1

Sort the array from highest to lowest in terms of []['time'] and get the first value:

function sort_arr($item_1, $item_2)
{
  return $item_2['time'] - $item_1['time'];
}

usort($arr, 'sort_arr');

// $arr[0] is the item with the highest time
  • I wouldn't recommend using a complex sort algorithm for something like getting a single value out of an array. Actually, sorting should only be done when really needed. The additional overhead isn't worth a "cool-looking" solution. – Marcello Mönkemeyer Oct 11 '16 at 08:11
0

You could always sort the array and take the first or last value respectively. You can make use of usort to sort your array by providing a custom comparison function to reflect your structure.

Here's a simple example:

$foo[1]["time"] = 2323443;
$foo[2]["time"] = 343435;
$foo[3]["time"] = 13455;
$foo[4]["time"] = 9873634;
$foo[5]["time"] = 82736;
$foo[6]["time"] = 9283;

function cmp($a, $b)
{
    if ($a["time"] == $b["time"]) {
        return 0;
    }
    return ($a["time"] < $b["time"]) 
        ? -1 
        : 1;
}

usort($foo, "cmp");

$max = $foo[count($foo)-1]["time"];
Nick Weaver
  • 47,228
  • 12
  • 98
  • 108