Группировка и сумма элементов из массива в пределах foreach
Я просматриваю результирующие множества из двух хранимых процедур, получая результаты в рамках одной хранимой процедуры на основе полей внутри другой.
Два массива, содержащие наборы результатов, представляют собой $customers и $subcustomers .
Текущий вывод print_r($out[‘chartInbound’]) :
Array ( [0] => Array ( [countInbound] => 426 [minsInbound] => 340 [name] => Telekomm [label] => 01-02 [customerid] => 6 ) [1] => Array ( [countInbound] => 1 [minsInbound] => 2 [name] => Telekomm [label] => 01-02 [customerid] => 6 ) [2] => Array ( [countInbound] => 3 [minsInbound] => 21 [name] => Telekomm [label] => 080 [customerid] => 6 ) [3] => Array ( [countInbound] => 1920 [minsInbound] => 15766 [name] => Telekomm [label] => 084 [customerid] => 6 ) [4] => Array ( [countInbound] => 2332 [minsInbound] => 17521 [name] => Telekomm [label] => 084 [customerid] => 6 ) . )
Вышеуказанные результаты необходимо сгруппировать по name , label , customerid с countInbound и minsInbound , так что:
Желаемый результат должен быть:
Array ( [0] => Array ( [countInbound] => 427 [minsInbound] => 342 [name] => Telekomm [label] => 01-02 [customerid] => 6 ) [1] => Array ( [countInbound] => 3 [minsInbound] => 21 [name] => Telekomm [label] => 080 [customerid] => 6 ) [2] => Array ( [countInbound] => 4252 [minsInbound] => 33287 [name] => Telekomm [label] => 084 [customerid] => 6 ) . )
Я думаю, что это должно сработать. Я не тестировал код, поэтому я не обещаю.
$map = array(); $i = 0; foreach($customers as $customer) < foreach($subcustomers as $subcustomer) < if($subcustomer['parent'] == $customer['id']) < if($customer['innumber'] == null && $subcustomer['innumber'] != null) < $key = $customer['name'] . '/' . $subcustomer['innumber'] . '/' . $customer['id']; if(isset($map[$key])) < $out['chartInbound'][$map[$key]]['countInbound'] += $customer['count']; $out['chartInbound'][$map[$key]]['minsInbound'] += ceil($customer['duration'] / 60); >else < $out['chartInbound'][$i] = array( 'name' =>$customer['name'], 'label' => $subcustomer['innumber'], 'countInbound' => $customer['count'], 'minsInbound' => ceil($customer['duration'] / 60), 'customerid' => $customer['id'], ); $map[$key] = $i++; > > > > >
Для каждой комбинации name , label и customerid он создает строковый ключ, который должен быть уникальным для этой комбинации. Затем он проверяет, есть ли какие-либо данные для этого ключа (путем сохранения отдельного списка ключей и их индексов в $out[‘chartInbound’] ). Если это так, он просто добавляет countInbound и minsInbound . Если это не помещает весь $chartInboundSub в $out[‘chartInbound’] .
Обратите внимание, что это зависит от уникальности ключа. Если вы, например, допустите / в именах, которые могут быть не такими.
Вместо использования циклов foreach я использую «итератор», который имеет каждый массив PHP.
Предполагая, что массив отсортирован, будет достаточно одного прохода, записывающего «текущий идентификатор группы».
Я использую технику «читать дальше», поэтому тест an’if не нужен, чтобы узнать, что делать с «текущей записью».
/** * Output stored in here. */ $output = array(); // groupId consists of: name, label, customerid // read ahead - we need the current entry of the source array. $currentEntry = current($source); while ($currentEntry !== false) < // process the array / file / resultset etc. // start of a group. process the first record that every group has. $currentGroupId = getGroupId($currentEntry); $currentGroupCountInbound = $currentEntry['countInbound']; $currentGroupMinsInbound = $currentEntry['minsInbound']; // read the next record as we always 'read ahead' after processing a record. next($source); $currentEntry = current($source); while ($currentGroupId == getGroupId($currentEntry)) < // same group = total the values. $currentGroupCountInbound += $currentEntry['countInbound']; $currentGroupMinsInbound += $currentEntry['minsInbound']; // next entry in the input array - will end this group if not the same. next($source); $currentEntry = current($source); >// end of the current group -- output the information. // add it to an array. or whatever. $output[] = array('groupid' => $currentGroupId, 'countInbound' => $currentGroupCountInbound, 'minsInbound' => $currentGroupMinsInbound); > // show the output. echo '
'; print_r($output); echo ''; exit; // --------------------------------- function getGroupId($entry = array()) < if (empty($entry)) < return array(); >return array( $entry['name'], $entry['label'], $entry['customerid'] ); >
Array( [0] => Array( [groupid] => Array( [0] => Telekomm [1] => 01-02 [2] => 6 ) [countInbound] => 427 [minsInbound] => 342 ) [1] => Array( [groupid] => Array( [0] => Telekomm [1] => 080 [2] => 6 ) [countInbound] => 3 [minsInbound] => 21 ) [2] => Array( [groupid] => Array( [0] => Telekomm [1] => 084 [2] => 6 ) [countInbound] => 4252 [minsInbound] => 33287 ) )
foreach цикл и сумма элементов массива
Необходимо написать функцию суммы элементов массива и задать проверку.
Я функцию на суммирование написал. Однако, не проходит проверка. Для начала я задал проверку на существует ли массив. Когда оба или один из массивов не задан, т. е. указан $arr1, выдает ошибку Invalid argument supplied for foreach(). Пожалуйста, подскажите и покажите, что исправить.1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32/* 1. Напишите функцию, которая принимает массив, а возвращает сумму его элементов. Если передан не массив, либо в нём нет элементов, либо некоторые элементы не являются числами, то должно возвращаться false. 2. Создайте несколько массивов для последующей передачи их в функцию из 1-го пункта. Массивы должны быть такими, чтобы детально проверить написанную функцию. 3. Передавайте все массивы и смотрите на получившийся результат. Если функция возвращает false, то выводить строку: «Некорректный массив», если идёт число, то выводить: «Сумма элементов массива равна …». */ $arr1 = 0; $arr2 = [3]; function addElArrays() { $sum = 0; $arg = func_get_args(); if (is_array($arg)) { foreach ($arg as $value) { foreach ($value as $num) { $sum += $num; // echo "$num, "; }; }; return "«Сумма элементов массива равна »."; }; return "«Некорректный массив»."; }; echo addElArrays($arr1, $arr2); ?>
Цикл foreach PHP — Примеры
Цикл foreach отличен от циклов while и for, и используется для обхода массива.
Как работает цикл foreach? Рассмотрим примеры.
1. Сначала пишется название массива, с которым предстоит работа.
2. Указывается обязательный оператор as и две произвольные переменные, но обычно это $key и $value (ключ и значение).Задача №1
Дан массив «Дни недели». С помощью цикла foreach вывести элементы массива в столбик.Задача №2
Дан массив с числами от 1 до 5. С помощью цикла foreach найти сумму элементов массива.Задача №3
Дан массив с числами от 1 до 5. С помощью цикла foreach найти сумму квадратов элементов массива.Задача №4
Дан массив arColors. Вывести столбец ключей и элементов массива в формате «ключ-значение»// -------- Задача №1 --------- echo "Задача №1
"; $arDays = ["Пн.", "Вн.", "Ср.", "Чт.", "Пт.", "Сб.", "Вс.",]; foreach($arDays as $key=>$value)< echo $value."
"; > echo ""; // -------- Задача №2 --------- echo "Задача №2 - Сумма элементов массива
"; $ar = [1, 2, 3, 4, 5]; $sum = 0; foreach($ar as $key=>$value) < $sum = $sum + $value; >echo $sum; echo ""; // -------- Задача №3 --------- echo "Задача №3 - Сумма квадратов элементов массива
"; $ar = [1, 2, 3, 4, 5]; $sum = 0; foreach($ar as $key=>$value) < $sum += $value*$value; >echo $sum; echo ""; // -------- Задача №4 --------- echo "Задача №4
"; $arColors = ["green"=>"Зеленый", "red"=>"Красный", "blue"=>"Синий"]; foreach($arColors as $key=>$value)< echo $key." - ".$value.'
'; >Задача №1 Пн. Вн. Ср. Чт. Пт. Сб. Вс. Задача №2 - Сумма элементов массива 15 Задача №3 - Сумма квадратов элементов массива 55 Задача №4 green - Зеленый red - Красный blue - Синий
array_sum
array_sum() returns the sum of values in an array.
Parameters
Return Values
Returns the sum of values as an integer or float; 0 if the array is empty.
Examples
Example #1 array_sum() examples
$a = array( 2 , 4 , 6 , 8 );
echo «sum(a) color: #007700″>. array_sum ( $a ) . «\n» ;?php
$b = array( «a» => 1.2 , «b» => 2.3 , «c» => 3.4 );
echo «sum(b) color: #007700″>. array_sum ( $b ) . «\n» ;
?>The above example will output:
User Contributed Notes 6 notes
If you want to calculate the sum in multi-dimensional arrays:
function array_multisum (array $arr ): float $sum = array_sum ( $arr );
foreach( $arr as $child ) $sum += is_array ( $child ) ? array_multisum ( $child ) : 0 ;
>
return $sum ;
>
?>Example:
echo array_multisum ( $data );
Notably the function converts strings to float and ignores strings if they are not convertable:
$a = array( «String» , 2 , 4 , 6 , 8 );
echo «sum(a) keyword»>. array_sum ( $a ) . «\n» ;$b = array( «12.3456» , 2 , 4 , 6 , 8 );
echo «sum(b) keyword»>. array_sum ( $b ) . «\n» ;
?>sum(a) = 20
sum(b) = 32.3456If you have a case where your array has int in strings, it sums them up as if there were only int in the array!
function sum_mix($a)
return array_sum($a);
>
var_dump(sum_mix([9, 3, ‘7’, ‘3’]));
Response will be int(22)array_sum() doesn’t «ignore strings if they are not convertible», it converts them to zero. array_product() does the same thing, where the difference between «ignoring» and «converting to zero» is much more obvious.
//you can also sum multidimentional arrays like this;
?php>
function arraymultisum (array $arr ) $sum = null ;
foreach( $arr as $child ) $sum += is_array ( $child ) ? arraymultisum ( $child ): $child ;
>
return $sum ;
>echo arraymultisum (array( 1 , 4 , 5 ,[ 1 , 5 , 8 ,[ 4 , 5 , 7 ]]));
array_sum converts strings to integer and array_sum(2,’2′) returns 4.
- Array Functions
- array_change_key_case
- array_chunk
- array_column
- array_combine
- array_count_values
- array_diff_assoc
- array_diff_key
- array_diff_uassoc
- array_diff_ukey
- array_diff
- array_fill_keys
- array_fill
- array_filter
- array_flip
- array_intersect_assoc
- array_intersect_key
- array_intersect_uassoc
- array_intersect_ukey
- array_intersect
- array_is_list
- array_key_exists
- array_key_first
- array_key_last
- array_keys
- array_map
- array_merge_recursive
- array_merge
- array_multisort
- array_pad
- array_pop
- array_product
- array_push
- array_rand
- array_reduce
- array_replace_recursive
- array_replace
- array_reverse
- array_search
- array_shift
- array_slice
- array_splice
- array_sum
- array_udiff_assoc
- array_udiff_uassoc
- array_udiff
- array_uintersect_assoc
- array_uintersect_uassoc
- array_uintersect
- array_unique
- array_unshift
- array_values
- array_walk_recursive
- array_walk
- array
- arsort
- asort
- compact
- count
- current
- end
- extract
- in_array
- key_exists
- key
- krsort
- ksort
- list
- natcasesort
- natsort
- next
- pos
- prev
- range
- reset
- rsort
- shuffle
- sizeof
- sort
- uasort
- uksort
- usort
- each
Сумма элементов массива
В этом разделе мы познакомимся с функцией, вычисляющей сумму всех элементов массива. Сама задача вычисления суммы значений массива предельно проста. Но зачем писать лишний раз один и тот же код, если можно воспользоваться специально созданной и всегда доступной функцией. Функция эта называется, как можно догадаться, array_sum(). И в качестве параметра ей передается только имя массива, сумму значений элементов которого нужно вычислить.
В качестве примера использования этой функции приведем решение более сложной задачи, чем просто вычисление суммы элементов.
Этот пример также иллюстрирует применение функции array_slice(), которую мы обсуждали чуть раньше.
Пример 7.16. Пусть дан массив натуральных чисел. Нужно найти в нем такое число, что сумма элементов справа от него равна сумме элементов слева от него.
//массив задается функцией array
$arr = array( 2 , 1 , 3 , 4 , 5 , 6 , 4 );
// перебираем каждый элемент массива $arr.
// Внутри цикла текущий ключ массива
// содержится в переменной $k,
// текущее значение – в переменной $val
foreach ( $arr as $k => $val ) $p = $k + 1 ;
// синтаксис array array_slice (
// array array,int offset [,int length])
// array_slice выделяет подмассив
// длины length в массиве array,
// начиная с элемента offset.
$out_next = array_slice ( $arr , $p );
// получаем массив элементов,
// идущих после текущего
$out_prev = array_slice ( $arr , 0 , $k );
// получаем массив элементов,
// идущих перед текущим
// функция mixed array_sum (array array)
// подсчитывает сумму элементов массива array
$next_sum = array_sum ( $out_next );
$prev_sum = array_sum ( $out_prev );
// если сумма элементов до текущего равна
// сумме элементов после, то выводим
// значение текущего элемента
if ( $next_sum == $prev_sum )
echo «value:$val» ;
// можно посмотреть, что представляют собой
// рассмотренные массивы на каждом шаге
// print_r($out_next); echo «
«;
// print_r($out_prev);
// echo «$next_sum, $prev_sum
«;
echo «
» ;
>
?>?phpПример 7.16. Программа поиска числа, такого что сумма элементов справа от него равна сумме элементов слева от него