Here is how you can multiply two arrays in the form of matrixes using a bit of matrix algebra (M*M).
By calling the function multiplyMatrix, you will be multiplying two sparse matrixes (zeros need not be included in the array for the operation to be performed).
<?php
$M = array(
0=>array(1=>1,4=>1),
1=>array(2=>1,3=>1),
3=>array(1=>1),
4=>array(5=>1),
5=>array(6=>1)
);
$M1 = multiplyMatrix($M, $M); //multiplying $M by itself
echo '<pre>';print_r($M1);echo '</pre>';
function multiplyMatrix($M1, $M2)
{
#Helena F Deus, Oct 06, 2008
##Multiply two matrixes; $M1 and $M2 can be sparse matrixes, the indexes on both should match
if(is_file($M1)) {$matrix1 = unserialize(file_get_contents($M1));}
else $matrix1 = $M1;
#transpose M2
$M2t = transpose($M2);
foreach ($M2t as $row=>$tmp) {
##sum the result of the value in the col multiplied by the value in the vector on the corresponding row
foreach ($M1 as $row1=>$tmp1) {
$multiply[$row1] = array_rproduct($tmp,$tmp1);
if(!$multiply[$row1]){
exit;
}
}
foreach ($multiply as $row1=>$vals) {
$sum[$row][$row1]=array_sum($vals);
}
}
$r=transpose($sum);
return ($r);
}
function transpose($M)
{
foreach ($M as $row=>$cols) {
foreach ($cols as $col=>$value) {
if($value)
$Mt[$col][$row]=$value;
}
}
ksort($Mt);
return ($Mt);
}
function array_rproduct($a1, $a2)
{
foreach ($a1 as $line=>$cols) {
$a3[$line] = $a1[$line]*$a2[$line];
foreach ($a2 as $line2=>$cols2) {
$a3[$line2] = $a1[$line2]*$a2[$line2];
}
}
ksort($a3);
return ($a3);
}
?>
array_sum
(PHP 4 >= 4.0.4, PHP 5)
array_sum — 배열내의 값들의 합을 계산한다
설명
mixed array_sum
( array $array
)
array_sum()은 배열안의 값들의 합을 정수나 부동소수점수로 반환한다.
Example#1 array_sum() 예제코드
<?php
$a = array(2, 4, 6, 8);
echo "sum(a) = ".array_sum($a)."\n";
$b = array("a"=>1.2,"b"=>2.3,"c"=>3.4);
echo "sum(b) = ".array_sum($b)."\n";
?>
위 프로그램의 결과는 다음과 같다:
sum(a) = 20 sum(b) = 6.9
Note: PHP 4.2.1 이전 버전에서는 전달되는 배열자체를 변경해버려서 문자열을 숫자로 변경했었다 (그값에 따라 대부분 0으로 변환된다).
array_sum
hdeus at yahoo dot com
06-Oct-2008 07:01
06-Oct-2008 07:01
c dot heckemueller at befestigungsfuchs dot de
05-Sep-2008 01:30
05-Sep-2008 01:30
<?php
/**
* sum values in array
*
* @param array $arr
* @param string [optional]$index
* @return int result
*/
function array_sum_key( $arr, $index = null ){
if(!is_array( $arr ) || sizeof( $arr ) < 1){
return 0;
}
$ret = 0;
foreach( $arr as $id => $data ){
if( isset( $index ) ){
$ret += (isset( $data[$index] )) ? $data[$index] : 0;
}else{
$ret += $data;
}
}
return $ret;
}
?>
With this function you can choose whether you sum specific keys in a multidim array, or a normalized array. it is designed to not trigger errors if a key is not set.
superman1101
27-Aug-2008 11:29
27-Aug-2008 11:29
To elaborate on djyb2003 at yahoo dot fr. His function can be converted to recursive, but i've made a smaller function to do so:
<?php
function array_sum_all($array) {
$func = create_function("&\$arr=0,\$key=0","static \$a=0; if(is_int(\$arr)) { \$a+=\$arr; } return \$a;");
array_walk_recursive($array,$func);
return $func();
}
$tab = array(
0 => array ("val1" => 2,"val2" => 5),
1 => array ("val1" => 6,"val2" => 10),
"toto" => array ("val1" => 15,"val2" => 50)
);
var_dump(array_sum_all($tab)); //This will output: int(88);
?>
hope this helps someone
djyb2003 at yahoo dot fr
29-Jan-2008 06:31
29-Jan-2008 06:31
here is a function that can sum values like these :
$tab = array(
0 => array ("val1" => 2,"val2" => 5)
1 => array ("val1" => 6,"val2" => 10)
"toto" => array ("val1" => 15,"val2" => 50)
);
sum_subarrays_by_key( $tab, "val1" );
the function will sum all values with "val1" key in tab subarrays.
function sum_subarrays_by_key( $tab, $key ) {
$sum = 0;
foreach($tab as $sub_array) {
$sum += $sub_array[$key];
}
return $sum;
}
it can be transformed to be recursive and do also all depths possible in an array.
Hope it can be usefull!
Coder
16-Aug-2007 04:10
16-Aug-2007 04:10
A much simpler algorithm for array_sub():
<?php
function array_sub($arr) {
if (!is_array($arr) || count($arr) == 0) {
return false;
} else {
// get first element
$base = array_shift($arr);
return $base - array_sum($arr);
}
}
?>
This will return the exact same results that didikdwi's version.
However, didikdwi's result depends on knowing what the first value is. When this likely bug is removed, the code is:
<?php
function array_sub($arr){
$temp = array_sum($arr);
return ( $temp !== false ? -$temp : false );
}
?>
didikdwi at gmail dot com
18-Jul-2007 06:48
18-Jul-2007 06:48
This is a simple approach to subtract array, both indexed and associative.
function array_sub($arr) {
if (!is_array($arr) || count($arr) == 0) {
return false;
} else {
// get first element
$base = array_shift($arr);
if (count($arr) == 1) {
// If only one element, return its
return $base;
}
foreach ($arr as $val) {
$base -= $val;
}
return $base;
}
}
// example
$arr1 = array(3, 2, 3);
echo array_sub($arr1); // Output: -2
$arr2 = array(3.5, 2, 3);
echo array_sub($arr2); // Output: -1.5
$arr3 = array('a' => 3, 'b' => 2, 'c' => 3);
echo array_sub($arr3); // Output: -2
herenvardo at gmail dot com
24-Nov-2006 03:28
24-Nov-2006 03:28
I'm not sure if something similar already exists, but I needed it so I made it:
<?php
/* Performs a pitagoric sum of the elements in $arr
The pitagoric sum of a set of values is the square root of
the sum of the sqare power of each value. So, for a, b, c
it's sqrt(a^2 + b^2 + c^2) */
/* If any element of $arr is an array itself, the array_sum
will be used. Alternatively, the values could be used by
recursion. Returns the integer part (floor) */
function array_pitag_sum($arr) {
if(is_array($arr) {
$ret = 0;
foreach($arr as $i) {
if(is_array($i)) {
$s = array_sum($i);
$ret += $s*$s;
} else {
$ret += $i*$i;
}
}
return floor(sqrt($ret));
} else {
return $arr;
}
}
?>
Tobias Schlemmer
27-Jul-2006 11:41
27-Jul-2006 11:41
<?php
$array1 = array('1'=>'1','2'=>'2','3'=>'3');
$array2 = array( '2'=>'1','3'=>'2','4'=>'3');
$array3 = array( '3'=>'1','4'=>'2','5'=>'3');
$array = array_sum_values( $array1, $array2, $array3 );
print_r($array);
/**
* Sums the values of the arrays be there keys (PHP 4, PHP 5)
* array array_sum_values ( array array1 [, array array2 [, array ...]] )
*/
function array_sum_values() {
$return = array();
$intArgs = func_num_args();
$arrArgs = func_get_args();
if($intArgs < 1) trigger_error('Warning: Wrong parameter count for array_sum_values()', E_USER_WARNING);
foreach($arrArgs as $arrItem) {
if(!is_array($arrItem)) trigger_error('Warning: Wrong parameter values for array_sum_values()', E_USER_WARNING);
foreach($arrItem as $k => $v) {
$return[$k] += $v;
}
}
return $return;
}
/* result:
Array
(
[1] => 1
[2] => 3
[3] => 6
[4] => 5
[5] => 3
)
*/
?>
jodymickey at yahoo dot com
01-Jun-2006 08:23
01-Jun-2006 08:23
In reference to KageKonjou's array_mode function...
If you only want to know the value in the array that occurs most (and not the number of times it actually occured), you can use this short function. It also suffers from the same problem in that if there is more than one mode, it will return only one.
<?php
function array_mode($array)
{
if(!is_array($array)) return false;
asort(array_count_values($array));
return array_pop($array);
}
?>
Moslehi[atsign]Gmail[dot]com
17-Mar-2006 03:13
17-Mar-2006 03:13
A simple example for numeric values :
<?PHP
function array_average($arr){
$sum = array_sum($arr);
$num = sizeof($arr);
echo $sum/$num;
}
$myarray = array(1,2,3,4);
array_average($myarray); // displays 2.5 as average of 1,2,3,4
?>
[Arash Moslehi]
darianlassan at yahoo dot de
04-Nov-2005 03:57
04-Nov-2005 03:57
function array_avg(&$array)
{
//**
returns the average value of all array-values
or false if no values in array (or not an array)
**//
if (!is_array($array) || count($array)==0)
return false;
else
return array_sum($array)/count($array);
} // array_avg()
Please add this function to PHP.
mroach at mroach dot com
27-Sep-2005 01:06
27-Sep-2005 01:06
I ran into a situation where I only wanted to sum elements of an array for certain keys. For that, I wrote this function
<?
function array_sum_by_key()
{
$args = func_get_args();
$arr = array_shift($args);
$to_sum = is_array($args[0]) ? $args[0] : $args;
$sum = 0;
foreach ( $arr as $k=>$v ) {
if ( in_array($k, $to_sum) ) {
$sum += $v;
}
}
return $sum;
}
$arr = array (
'dog' => 1,
'cat' => 2,
'rat' => 4,
'mat' => 8,
'bat' => 16
);
echo array_sum_by_key($arr, 'dog', 'mat');
// Result: 9
?>
Alternatively, you can pass the keys to sum as an array
<?
$to_sum = array('dog', 'bat');
echo array_sum_by_key($arr, $to_sum);
// Result: 17
?>
KageKonjou at GMail dot com
12-Aug-2005 09:22
12-Aug-2005 09:22
Not sure where else to put this, but I added something that determines the most commonly occuring item in an array. Known Bugs: It will always return the first value if no mode are found, and the first mode found if more are found of same or lesser count.
<?php
function array_mode($array) {
$count = array();
foreach ($array as $item) {
$count[$item]++;
}
$mostcommon = "";
$iter = 0;
foreach ($count as $k => $v) {
if ($v > $iter) {
$mostcommon = $k;
$iter = $v;
}
}
return array("mode" => $mostcommon, "count" => $count[$mostcommon]);
}
?>
punchto at hotmail dot com
15-Mar-2005 07:06
15-Mar-2005 07:06
Microsoft Excel - SUMIF()
function sumif($array,$criteria,$sum_array){
if(is_array($array) && is_array($sum_array) && trim($criteria)!= ""){
$array_count = (count($array) < count($sum_array)) ? count($array):count($sum_array);
for($i=0;$i<$array_count;$i++){
if(ereg("^<",$criteria)){
$value = ereg_replace("^<","",$criteria);
$result += $array[$i] < $value ? $sum_array[$i]:0;
}
elseif(ereg("^>",$criteria)){
$value = ereg_replace("^>","",$criteria);
$result += $array[$i] > $value ? $sum_array[$i]:0;
}
else{
$value = $criteria;
$result += $array[$i] == $value ? $sum_array[$i]:0;
}
}
return $result ? $result:0;
}
}
adam at laural dot com dot au
01-Mar-2005 04:37
01-Mar-2005 04:37
Here's a function to return the sum of a portion of an array:
function array_partial_sum($array, $start, $length){
$new_array = array_slice($array, $start, $length);
return array_sum($new_array);
}
$array = array(1, 2, 3, 4, 5);
print array_partial_sum($array, 0, 3); // prints 6
ncheung at maine dot rr dot com
07-Feb-2005 06:02
07-Feb-2005 06:02
For clarity, array indices containing boolean values such as TRUE and FALSE are added up as though they are 1 and 0 respectively.
mucello NOO SPAM @ weatherimages dOt org
22-Oct-2003 03:44
22-Oct-2003 03:44
If you want to find the AVERAGE of the values in your array, use the sum and count functions together. For example, let's say your array is $foo and you want the average...
<?php
$average_of_foo = array_sum($foo) / count($foo);
?>
mcrm at NOTNEEDIT dot freemal dot it
13-Aug-2003 09:40
13-Aug-2003 09:40
Hi people, if someone is searching a function that works also with multimension array, i suggest this :
<?php
function cw_array_count($a) {
if(!is_array($a)) return $a;
foreach($a as $key=>$value)
$totale += cw_array_count($value);
return $totale;
}
$a[0][E][PS][P][a1]=1;
$a[0][E][PS][P][a2]=2;
$a[0][E][PJ][P][a2]=2;
$a[1][E][PS][E][a3]=3;
echo cw_array_count($a[0]);
// or
echo cw_array_count($a[0][E]);
?>
Bye, Bye.
R.Martina
drverieevil at REMOVEMEasenne dot org
30-Jul-2003 03:14
30-Jul-2003 03:14
If some array elements arent integers, function will change them to integers (content of array will not change) type and then sum them.
Example:
<?php
$foo[] = "12";
$foo[] = 10;
$foo[] = "bar";
$foo[] = "summer";
echo array_sum ($foo); //same as echo "22";
?>
