У меня есть массив в этом формате:
Array ( [0] => Array ( [id] => 117 [name] => Networking [count] => 16 ) [1] => Array ( [id] => 188 [name] => FTP [count] => 23 ) [2] => Array ( [id] => 189 [name] => Internet [count] => 48 ) )
Есть ли хороший способ получить минимальные и максимальные значения «count»? Я мог бы сделать это, используя несколько циклов, но я думал, что может быть лучший способ.
В отличие от других, вы не можете использовать функции min()
/ max()
для этой проблемы, так как эти функции не понимают передаваемые в них массивы данных (массива). Эти функции работают только для скалярных элементов массива.
НАЧАТЬ ИЗОБРАЖЕНИЕ
Причина, по которой использование min()
и max()
видимому, дает правильный ответ, относится к массивам типа-casting к целым числам, которые являются неопределенным поведением :
Поведение преобразования в integer не определено для других типов. Не полагайтесь на какое-либо наблюдаемое поведение, так как оно может меняться без предупреждения.
Мое высказывание выше о типе-литье было неправильным. Фактически min()
и max()
работают с массивами, но не в том, как OP нуждается в их работе. При использовании min()
и max()
с несколькими массивами или массивом элементов массивов сравниваются элементы по элементу слева направо:
$val = min(array(2, 4, 8), array(2, 5, 1)); // array(2, 4, 8) /* * first element compared to first element: 2 == 2 * second element compared to second element: 4 < 5 * first array is considered the min and is returned */
Переведенный в проблему ОП показывает, почему прямое использование min()
и max()
видимому, дает правильный результат. Первые элементы массива – это id
, поэтому min()
и max()
сначала сравнивают их, кстати, приводят к правильному результату, потому что самый низкий id
– тот, у которого самый низкий count
а самый высокий id
– тот, который имеет максимально высокий count
.
END EDIT
Правильный способ – использовать цикл.
$a = array( array('id' => 117, 'name' => 'Networking', 'count' => 16), array('id' => 188, 'name' => 'FTP', 'count' => 23), array('id' => 189, 'name' => 'Internet', 'count' => 48) ); $min = PHP_INT_MAX; $max = 0; foreach ($a as $i) { $min = min($min, $i['count']); $max = max($max, $i['count']); }
Вы можете использовать функции max () и min () .
Что вы сделали с несколькими циклами? Одного вполне достаточно 🙂
Вы можете использовать функции max
/ min
поскольку они возвратят массив, содержащий максимум / минимум каждого индекса. Ваш пример должен возвращать array(189, 'Networking ', 48)
для max
. Затем вы можете захватить счет из этого массива.
Обновление этого не работает, как я исключал. Пример справочной страницы вводит в заблуждение, а пример дает правильный результат с использованием max, но это просто совпадение.
Похоже, вы не можете использовать max () для 2D-массива. Он просто возвращает наибольший массив, а не max () каждого индекса (как указано в нескольких ответах).
Так:
$count = array(); foreach($arr as $_arr) { $count[] = $_arr['count']; } var_dump(max($count), min($count));
Есть ли эквивалентная встроенная функция для этого? (даже без возможности тестирования )
/ ** * извлекает столбец из 2D-массива с необязательным выбором над другим столбцом * * @param $ массив aArray для извлечения из * @param $ aColName имя столбца для извлечения, например. 'O_NAME' * @param $ aColTest (необязательно) имя столбца, чтобы выполнить тест, например. 'O_ID' * @param $ aTest (необязательная) строка для теста ex. "> = 10", "== '". $ Toto. "" " * @return 1D массив с только извлеченным столбцом * @access public * / функция extractColFromArray ($ aArray, $ aColName, $ aColTest = "", $ aTest = "") { $ mRes = array (); foreach ($ aArray как $ row) { if (($ aColTest == "") || (eval ("return". $ row [$ aColTest]. $ aTest. ";"))) { $ mRes [] = $ row [$ aColName]; } } return $ mRes; } // extractColFromArray
Если нужный столбец первым в массиве, вы можете использовать следующие однострочные:
$max = max(array_map('current', $a)); $min = min(array_map('current', $a));
Это найдет мин / макс id