Значения сумм многомерного массива с помощью ключа без цикла

У меня есть это:

Array ( [0] => Array ( [f_count] => 1 [uid] => 105 ) [1] => Array ( [f_count] => 0 [uid] => 106 ) [2] => Array ( [f_count] => 2 [uid] => 107 ) [3] => Array ( [f_count] => 0 [uid] => 108 ) [4] => Array ( [f_count] => 1 [uid] => 109 ) [5] => Array ( [f_count] => 0 [uid] => 110 ) [6] => Array ( [f_count] => 3 [uid] => 111 ) ) 

Мне нужно: 7 ", что является суммой столбца f_count .

Я пытался понять это на пару часов. Я думал, что array_sum() будет работать, но не с многомерным массивом. Итак, я попытался выяснить, как изолировать f_count s unset() или сплайсинг или что-то еще, но каждое решение, похоже, связано с циклом foreach . Я перепутал с array_map , array_walk и другими безрезультатно. Я не нашел функцию, которая хорошо работает с многомерными массивами.

Я запускаю PHP 5.4.

Может кто-нибудь, пожалуйста, покажите мне, как суммировать эту колонку без цикла foreach ?

Если это помогает, значения f_count никогда не будут выше 100 , а значения uid всегда будут больше 100 .


В качестве альтернативы, если есть способ выполнить мой запрос по-другому, так что массив не является многомерным, что, очевидно, будет работать.

 $query = "SELECT f_count, uid FROM users WHERE gid=:gid"; ... $array = $stmt->fetchAll(); 

Я использую PDO.

Вам нужно array_map() его с array_map() чтобы сначала выбрать столбец f_count :

 array_sum(array_map(function($item) { return $item['f_count']; }, $arr)); 

Конечно, внутренне это выполняет двойной цикл; это просто, что вы не видите его внутри кода. Вы можете использовать array_reduce() чтобы избавиться от одного цикла:

 array_reduce($arr, function(&$res, $item) { return $res + $item['f_count']; }, 0); 

Однако, если скорость является единственным интересом, foreach остается самым быстрым:

 $sum = 0; foreach ($arr as $item) { $sum += $item['f_count']; } 

Это связано с «локальностью» используемых вами переменных, т. Е. Нет никаких вызовов функций, используемых для вычисления окончательной суммы.

В php 5.5+ вы можете просто использовать array_column и array_sum следующим образом:

  $value = array_sum(array_column($arr,'f_count')); 

для этого типа ситуации цикл foreach является наилучшим вариантом, но если вы должны делать это несколько раз на одной странице, тогда u должен поставить цикл foreach в функцию, чтобы ваш код оставался чистым

 function sum_index($arr, $col_name){ $sum = 0; foreach ($arr as $item) { $sum += $item[$col_name]; } return $sum; } 

редактировать

После поиска я обнаружил, что функция array_column существует в php 5.5 +, чтобы получить все значения одиночного столбца в виде массива.

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

 //to get all values of single column from multidimensional array, this function exist in php 5.5 or greater. if(!function_exists("array_column")) { function array_column($array,$column_name) { return array_map(function($element) use($column_name){return $element[$column_name];}, $array); } } 

Если вы хотите получить все значения одного столбца, тогда вызовите функцию выше:

 $newArray = array_column($array,$column_name); 

Если вы хотите получить сумму всех значений одного столбца, используйте следующий код:

 $newArraySum = array_sum(array_column($array,$column_name)); 

Поскольку вы используете PHP 5.4 с PDO, может быть еще один способ сделать это (доступно в PHP 5.1+):

  • используйте fetchAll() PDO fetchAll() с PDO::FETCH_COLUMN в качестве fetch_style и 0-индексный номер столбца в качестве fetch_argument .

В соответствии с вашим примером это может быть:

 $query = "SELECT f_count, uid FROM users WHERE gid=:gid"; ... $array_fcount = $stmt->fetchAll(PDO::FETCH_COLUMN, 0); 

Теперь используйте функцию array_sum для суммирования значений массива:

 $fcount_sum = array_sum($array_fcount); 

Вы также можете обратиться к документации по PHP по адресу http://php.net/manual/en/pdostatement.fetchall.php

Надеюсь, это поможет, и производительность может быть лучше, чем цикл! Как уже упоминалось в других ответах, в PHP 5.5 и далее у вас есть функция array_column() чтобы получить $array_fcount непосредственно из другого массива.