|
array_diff_assoc
Computes the difference of arrays with additional index check
(PHP 4 >= 4.3.0, PHP 5)
Example 237. array_diff_assoc() example
In this example you see the <?php The above example will output: Array Example 238. array_diff_assoc() example
Two values from key => value pairs are
considered equal only if <?php The above example will output: Array Related Examples ( Source code ) » array_diff_assoc Examples ( Source code ) » array_diff_assoc Code Examples / Notes » array_diff_assocmichael johnson
[jochem at iamjochem dawt com] Here is a slightly enhanced version of Micheal Johnsons function. This version accepts arguments in the same way as array_diff_assoc (i.e. you can pass as many arrays as you want - any arguments that are not arrays are ignored). If the first argument is not an array you automatically get empty array back: The point of the function is to return all values in the first array whose keys (only keys are checked!) are not present in any subsequently passed arrays. [original post] array_diff_assoc() requires that both the key and the value pairs match. To match based on keys only, try this function. <?php function array_diff_keys() { $args = func_get_args(); $res = $args[0]; if(!is_array($res)) { return array(); } for($i=1;$i<count($args);$i++) { if(!is_array($args[$i])) { continue; } foreach ($args[$i] as $key => $data) { unset($res[$key]); } } return $res; } // Example $a = array('a' => '1', 'b' => '2', 'c' => '3'); $b = array('a' => '2', 'b' => '2', 'e' => '4'); // Yields array('a' => '1', 'c' => '3') // Note that the 'a' index is not removed (as one might expect) $c = array_diff_assoc($a, $b); // Yields array('c' => '3') $d = array_diff_keys($a, $b); ?> sc1n
[anders dot carlsson at mds dot mdh dot se] The user contributed array_diff_assoc_recursive function is good except for the original array_diff_assoc always (?) returns an array. Therefore I propose that $difference is initially set to an empty array (and the array is always returned), and the comparison against FALSE is replaced by count($new_diff). At least that's the modifications I made to run it they way my code expects. [original post] The following will recursively do an array_diff_assoc, which will calculate differences on a multi-dimensional level. (Forgive me if the braces do not line up, the note script did not like my tabs, and gave me trouble on some spaces.) <?php function array_diff_assoc_recursive($array1, $array2) { foreach($array1 as $key => $value) { if(is_array($value)) { if(!is_array($array2[$key])) { $difference[$key] = $value; } else { $new_diff = array_diff_assoc_recursive($value, $array2[$key]); if($new_diff != FALSE) { $difference[$key] = $new_diff; } } } elseif(!isset($array2[$key]) || $array2[$key] != $value) { $difference[$key] = $value; } } return !isset($difference) ? 0 : $difference; } ?> carl
To unset elements in an array if you know the keys but not the values, you can do: <?php $a = array("foo", "bar", "baz", "quux"); $b = array(1, 3); // Elements to get rid of foreach($b as $e) unset($a[$e]); ?> Of course this makes most sense if $b has many elements or is dynamically generated. cedric
To diff between n-dimensional array, juste use this : function array_diff_values($tab1, $tab2) { $result = array(); foreach($tab1 as $values) if(! in_array($values, $tab2)) $result[] = $values; return $result; } aidan
This functionality is now implemented in the PEAR package PHP_Compat. More information about using this function without upgrading your version of PHP can be found on the below link: http://pear.php.net/package/PHP_Compat contact
The direction of the arguments does actually make a difference: <? $a = array( 'x' => 'x', 'y' => 'y', 'z' => 'z', 't' => 't', ); $b = array( 'x' => 'x', 'y' => 'y', 'z' => 'z', 't' => 't', 'g' => 'g', ); print_r(array_diff_assoc($a, $b)); print_r(array_diff_assoc($b, $a)); ?> echoes: Array ( ) Array ( [g] => g ) alexander podgorny
NOTE: the diff_array also removes all the duplicate values that match to the values in the second array: <? $array1 = array("a","b","c","a","a"); $array2 = array("a"); $diff = array_diff($array1,$array2); // yields: array("b","c") the duplicate "a" values are removed ?> benjamin
Hi all, For php versions < 4.3... <?php /** * array_diff_assoc for version < 4.3 **/ if (!function_exists('array_diff_assoc')) { function array_diff_assoc($a1, $a2) { foreach($a1 as $key => $value) { if(isset($a2[$key])) { if((string) $value !== (string) $a2[$key]) { $r[$key] = $value; } }else { $r[$key] = $value; } } return $r ; } } Hope there's no bug, cheers ?> chinello
A small modification for array_diff_assoc_recursive from 'sc1n at yahoo dot com' , to not display any notices if a key don't exist and if error_reporting is set to E_ALL: <?php function array_diff_assoc_recursive($array1, $array2) { foreach($array1 as $key => $value) { if(is_array($value)) { if(!isset($array2[$key])) { $difference[$key] = $value; } elseif(!is_array($array2[$key])) { $difference[$key] = $value; } else { $new_diff = array_diff_assoc_recursive($value, $array2[$key]); if($new_diff != FALSE) { $difference[$key] = $new_diff; } } } elseif(!isset($array2[$key]) || $array2[$key] != $value) { $difference[$key] = $value; } } return !isset($difference) ? 0 : $difference; } ?> |
Change Languagearray_change_key_case array_chunk 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_key_exists array_keys array_map array_merge_recursive array_merge array_multisort array_pad array_pop array_product array_push array_rand array_reduce 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 each end extract in_array key krsort ksort list natcasesort natsort next pos prev range reset rsort shuffle sizeof sort uasort uksort usort |