Я пытаюсь выбрать максимальное значение для конкретного ключа в многомерном массиве. У меня возникла проблема «добраться до» ключа, о котором идет речь …
Итак, массив (который намного длиннее, чем то, что я публикую здесь)
[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);
Есть ли способ для меня сделать это без необходимости воссоздать весь массив?
$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);
В 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));
Самый простой способ – это, пожалуй, ваша первоначальная мысль, которая состоит в том, чтобы один раз dnum
ваш массив и вытащить все ключи 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()
в сортировке массива с помощью usort()
и пользовательской функции сортировки, основанной на свойствах объекта dnum
. Это, вероятно, будет намного медленнее, чем просто цикл вашего массива, поэтому я не думаю, что рекомендую его, если вам не нужен массив, отсортированный как побочный эффект.
Если вам нравятся oneliners
$max = max( array_map(function( $row ){ return $row->dnum; }, $myarray) );