// parse through an array, $a is the original array and // $b is the new array to merge into it function parse_array($a, $b) { // an array that will hold the new, properly // merged version of the two arrays $new = array(); // if we've encountered numbered keys, this // will be true $numbers = FALSE; // if $a is bigger than $b, lots of code repetition // beyond this point.. ugh. if(count($a) >= count($b)) { // override the arrays if necessary foreach($a as $key => $val) { // if we've found a number, stop the loop if((string)(int)$key == $key) // dunno why ctype_digit didn't work... { $numbers = TRUE; break; } // otherwise, override the key with a $b value // if it exists. else $new[$key] = isset($b[$key]) ? $b[$key] : $a[$key]; } } // otherwise.. else { // override the arrays if necessary foreach($b as $key => $val) { if((string)(int)$key == $key) { $numbers = TRUE; break; } // otherwise, override the key with an $a value // if it exists. else $new[$key] = isset($a[$key]) ? $a[$key] : $b[$key]; } } // merge the arrays if they are numbered keys if($numbers) $new = array_merge($a, $b); // loop through the new array and check for sub-arrays foreach($new as $key => $val) { // recursively go through if(is_array($new[$key]) && !is_numeric($key)) $new[$key] = parse_array((isset($a[$key]) ? $a[$key] : array()), (isset($b[$key]) ? $b[$key] : array())); } // return the new, merged array return $new; }