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

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

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

[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. Я знаю, что макс. функция позволяет мне делать это, но я не уверен, как сослаться на dnum элемент, не помещая все это в цикл foreach, и если бы я делаю это, затем макс. не была бы функция, чтобы использовать, исправиться?

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

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

Существует ли способ для меня сделать это, не имея необходимость воссоздавать целый массив?

11
задан Felix Kling 17 March 2012 в 12:06
поделиться

3 ответа

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

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

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

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

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

$numbers = array();
foreach($array as $obj)
{
    $numbers[] = $obj->dnum;
}
$max = max($numbers);
10
ответ дан 3 December 2019 в 01:29
поделиться

В 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));
22
ответ дан 3 December 2019 в 01:29
поделиться

Самым простым способом, вероятно, является ваша первоначальная мысль: один раз зациклить массив и вытащить все ключи 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
ответ дан 3 December 2019 в 01:29
поделиться
Другие вопросы по тегам:

Похожие вопросы: