PHP Получить минимальные и максимальные значения в двумерном ассоциативном массиве

У меня есть массив в этом формате:

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 () .

Что вы сделали с несколькими циклами? Одного вполне достаточно 🙂

  1. Получите первый элемент, подсчитав счет как $ min, так и max
  2. итерации по остальным, сравните счетчик с каждым $ min и $ max, если меньше / больше, назначьте новое значение счета

Вы можете использовать функции 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