Получить максимальное значение из элемента в многомерном массиве?

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

Итак, массив (который намного длиннее, чем я здесь размещаю)

[0] => stdClass Object
    (
        [id] => 70
        [cust] => 4
        [dnum] => 1
        [upper] => Array
            (
                [0] => 66
            )

    )
[1] => stdClass Object
    (
        [id] => 43
        [cust] => 42
        [dnum] => 2
        [upper] => Array
            (
                [0] => 77
            )

    )
[2] => stdClass Object
    (
        [id] => 12
        [cust] => 3
        [dnum] => 0
        [upper] => Array
            (
                [0] => 99
            )

    )

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

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

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

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

Ответ 1

$max = 0;
foreach($array as $obj)
{
    if($obj->dnum > $max)
    {
        $max = $obj->dnum;
    }
}

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

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

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

Другим решением является

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

Ответ 2

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

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

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

В качестве альтернативы вы можете использовать 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));

Ответ 3

Самый простой способ - это, вероятно, ваша первоначальная мысль, которая заключается в том, чтобы один раз заколить ваш массив и вытащить все ключи 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. Это, вероятно, будет намного медленнее, чем просто цикл вашего массива, поэтому я не думаю, что рекомендую его, если вам не нужен массив, отсортированный как побочный эффект.

Ответ 4

Если вам нравится oneliners

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