Сумма элементов массива php foreach

Группировка и сумма элементов из массива в пределах 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’] .

Читайте также:  Hello World

Обратите внимание, что это зависит от уникальности ключа. Если вы, например, допустите / в именах, которые могут быть не такими.

Вместо использования циклов 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» ;

$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.3456

If 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;

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 «


    » ;
    >
    ?>

    Пример 7.16. Программа поиска числа, такого что сумма элементов справа от него равна сумме элементов слева от него

    Источник

Оцените статью