For a new project, I needed to combine two or more associative arrays and sum the values of any keys that exist in common. I was a little surprised to find that there wasn’t a built-in function to do this in PHP. So I wrote my own. It can accept any number of arrays as arguments, and goes through each array one key at a time, comparing the keys to those in an output array. Where the keys match, the values are summed. If the key does not exist in the output array, it’s appended to it.
The function returns an array that contains all of the unique keys in the input arrays.
If anyone has any ideas about how to optimize this, please post a comment. One thought would be to use the first array as the output array, avoiding the key-by-key comparison of the first array against an empty array.
function array_mesh() { // Combine multiple associative arrays and sum the values for any common keys // The function can accept any number of arrays as arguments // The values must be numeric or the summed value will be 0 // Get the number of arguments being passed $numargs = func_num_args(); // Save the arguments to an array $arg_list = func_get_args(); // Create an array to hold the combined data $out = array(); // Loop through each of the arguments for ($i = 0; $i < $numargs; $i++) { $in = $arg_list[$i]; // This will be equal to each array passed as an argument // Loop through each of the arrays passed as arguments foreach($in as $key => $value) { // If the same key exists in the $out array if(array_key_exists($key, $out)) { // Sum the values of the common key $sum = $in[$key] + $out[$key]; // Add the key => value pair to array $out $out[$key] = $sum; }else{ // Add to $out any key => value pairs in the $in array that did not have a match in $out $out[$key] = $in[$key]; } } } return $out; }
If you want to test it out, here’s some additional code.
$a = array('abc' => '100.000', 'def' => '50', 'ghi' => '25', 'xyz' => '10'); $b = array('abc' => '100.333', 'def' => '75', 'ghi' => '50', 'jkl' => '25'); $c = array('abc' => '100.111', 'def' => '75', 'ghi' => '50', 'uvw' => '5'); echo "<pre>"; print_r(array_mesh($a, $b, $c)); echo "</pre>";
I hope you find it helpful.
looked for this all around the web. π
thanks.
Been searching all over the web for something like this for the past few hours. Your function works like a champ. Thanks for posting.
Very useful Thank you π
Great tutorial. I don’t believe this works with multidimensional arrays. Would that be difficult to implement?
Great tutorial. I donβt believe this works with multidimensional arrays. Would that be difficult to implement?
Just bumped into this post after searching for this kind of function.
However I needed it to work with multidimensional functions, so I made some adjustments.
function array_mesh()
{
// https://ardamis.com/2009/10/12/php-function-sum-values-associative-arrays/
// Combine multiple associative arrays and sum the values for any common keys
// The function can accept any number of arrays as arguments
// The values must be numeric or the summed value will be 0
// Note! adjusted to work with multi-dimentional arrays
// Get the number of arguments being passed
$numargs = func_num_args();
// Save the arguments to an array
$arg_list = func_get_args();
// Create an array to hold the combined data
$out = array();
// Loop through each of the arguments
for ($i = 0; $i $value) {
// If the same key exists in the $out array
if (array_key_exists($key, $out)) {
if (is_array($value)) {
$out[$key] = array_mesh($in[$key], $out[$key]);
} else {
// Sum the values of the common key
$sum = $in[$key] + $out[$key];
// Add the key => value pair to array $out
$out[$key] = $sum;
}
} else {
// Add to $out any key => value pairs in the $in array that did not have a match in $out
$out[$key] = $in[$key];
}
}
}
return $out;
}