Получить максимальное значение от элемента в многомерном массиве? - PullRequest
11 голосов
/ 03 февраля 2010

Я пытаюсь выбрать максимальное значение для определенного ключа в многомерном массиве.У меня проблемы с "получением" ключа, о котором идет речь ...

Итак, массив (который гораздо длиннее, чем то, что я публикую здесь)я пытаюсь найти максимальное значение "dnum" по всему массиву, поэтому в этом примере $ max = 2. Я знаю, что функция max позволяет мне это сделать, но я не уверен, как ссылаться на элемент dnumбез помещения всего этого в цикл foreach, и если я сделаю это, то max не будет функцией для использования, верно?

Итак, я не могу точно сделать это:

$max = max($myarray[]->dnum);

Есть ли способ сделать это без необходимости воссоздания всего массива?

Ответы [ 4 ]

21 голосов
/ 03 февраля 2010

В PHP 5.2 единственный способ сделать это - перебрать массив.

$max = null;
foreach ($arr as $item) {
  $max = $max === null ? $item->dnum : max($max, $item->dnum);
}

Примечание: Я добавил результат к 0, потому что если все значения dnum отрицательны, то принятое сейчас решение даст неверный результат. Вам нужно посеять максимум с чем-то разумным.

В качестве альтернативы вы можете использовать array_reduce():

$max = array_reduce($arr, 'max_dnum', -9999999);

function max_denum($v, $w) {
  return max($v, $w->dnum);
}

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

$max = array_reduce($arr, function($v, $w) {
  return max($v, $w->dnum);
}, -9999999);

Вы также можете использовать array_map():

function get_dnum($a) {
  return $a->dnum;
}

$max = max(array_map('get_dnum', $arr));
10 голосов
/ 03 февраля 2010
$max = 0;
foreach($array as $obj)
{
    if($obj->dnum > $max)
    {
        $max = $obj->dnum;
    }
}

Эта функция будет работать правильно, если ваше наибольшее число не является отрицательным (отрицательные значения, пустые массивы и 0 возвращают максимальное значение как 0).

Поскольку вы используете объект, который может иметь пользовательские свойства / структуры, я не верю, что на самом деле есть какие-то «предопределенные» функции, которые вы можете использовать для его получения. Можно использовать цикл foreach.

Вы действительно не можете уйти от цикла foreach, так как даже внутренние функции используют цикл foreach, он просто за кадром.

Другое решение -

$numbers = array();
foreach($array as $obj)
{
    $numbers[] = $obj->dnum;
}
$max = max($numbers);
4 голосов
/ 03 февраля 2010

Самый простой способ - это, пожалуй, ваша первоначальная мысль: один раз зациклить массив и вытащить все ключи dnum в отдельный массив, а затем вызвать max() для этого:

$out = array();
foreach($myarray as $obj) {
    $out[] = $obj->dnum;
}
echo max($out);

Вы можете сделать это без создания отдельного массива, но в итоге вы будете вызывать max() гораздо чаще. Производительность / использование памяти будет отличаться между двумя, вы всегда можете сравнить его:

$first = $myarray[0];  //assume zero start index
$max = $first->dnum;
foreach($myarray as $obj) {
    $max = max($max,$obj->dnum);
}
echo $max;

Единственный способ, которым вы могли бы воспользоваться, - это отсортировать массив, используя usort() и пользовательскую функцию сортировки, основанную на свойствах объекта dnum. Однако, вероятно, это будет намного медленнее, чем просто зацикливание массива, поэтому я не думаю, что рекомендую его, если вам не нужен массив, отсортированный в качестве побочного эффекта.

3 голосов
/ 07 августа 2015

Если вы любите oneliners

$max = max( array_map(function( $row ){ return $row->dnum; }, $myarray) );
...