У меня есть это:
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
непосредственно из другого массива.