andrey Wed Sep 11 14:13:48 2002 EDT Modified files: /php4/ext/standard array.c basic_functions.c php_array.h Log: New function added : array_diff_assoc() . Like array_diff() but does additional checks on key values. Test script will be added too. #My first patch . it feels strange :) Index: php4/ext/standard/array.c diff -u php4/ext/standard/array.c:1.187 php4/ext/standard/array.c:1.188 --- php4/ext/standard/array.c:1.187 Tue Sep 10 18:36:43 2002 +++ php4/ext/standard/array.c Wed Sep 11 14:13:48 2002 @@ -21,7 +21,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: array.c,v 1.187 2002/09/10 22:36:43 edink Exp $ */ +/* $Id: array.c,v 1.188 2002/09/11 18:13:48 andrey Exp $ */ #include "php.h" #include "php_ini.h" @@ -2621,9 +2621,7 @@ } /* }}} */ -/* {{{ proto array array_diff(array arr1, array arr2 [, array ...]) - Returns the entries of arr1 that have values which are not present in any of the others arguments */ -PHP_FUNCTION(array_diff) +static void php_array_diff(INTERNAL_FUNCTION_PARAMETERS, int behavior TSRMLS_DC) { zval ***args = NULL; HashTable *hash; @@ -2660,7 +2658,11 @@ for (p = hash->pListHead; p; p = p->pListNext) *list++ = p; *list = NULL; - zend_qsort((void *) lists[i], hash->nNumOfElements, sizeof(Bucket *), array_data_compare TSRMLS_CC); + if (behavior == 0) { + zend_qsort((void *) lists[i], hash->nNumOfElements, +sizeof(Bucket *), array_data_compare TSRMLS_CC); + } else if (behavior == 1) { + zend_qsort((void *) lists[i], hash->nNumOfElements, +sizeof(Bucket *), array_key_compare TSRMLS_CC); + } } /* copy the argument array */ @@ -2672,12 +2674,27 @@ while (*ptrs[0]) { c = 1; for (i=1; i<argc; i++) { - while (*ptrs[i] && (0 < (c = array_data_compare(ptrs[0], ptrs[i] TSRMLS_CC)))) - ptrs[i]++; - if (!c) { - if (*ptrs[i]) + if (behavior == 0) { + while (*ptrs[i] && (0 < (c = +array_data_compare(ptrs[0], ptrs[i] TSRMLS_CC)))) ptrs[i]++; - break; + } else if (behavior == 1) { + while (*ptrs[i] && (0 < (c = +array_key_compare(ptrs[0], ptrs[i] TSRMLS_CC)))) + ptrs[i]++; + } + if (!c) { + if (behavior == 0) { + if (*ptrs[i]) + ptrs[i]++; + break; + } else if (behavior == 1) { + if (*ptrs[i]) { + if (array_data_compare(ptrs[0], +ptrs[i] TSRMLS_CC) != 0) { + c = -1; + } else { + break; + } + } + } } } if (!c) { @@ -2691,8 +2708,13 @@ zend_hash_index_del(Z_ARRVAL_P(return_value), p->h); if (!*++ptrs[0]) goto out; - if (array_data_compare(ptrs[0]-1, ptrs[0] TSRMLS_CC)) + if (behavior == 0) { + if (array_data_compare(ptrs[0]-1, ptrs[0] +TSRMLS_CC)) + break; + } else if (behavior == 1) { + /* in this case no array_key_compare is needed +*/ break; + } } } else { /* ptrs[0] in none of the other arguments */ @@ -2700,8 +2722,13 @@ for (;;) { if (!*++ptrs[0]) goto out; - if (array_data_compare(ptrs[0]-1, ptrs[0] TSRMLS_CC)) + if (behavior == 0) { + if (array_data_compare(ptrs[0]-1, ptrs[0] +TSRMLS_CC)) + break; + } else if (behavior == 1) { + /* in this case no array_key_compare is needed +*/ break; + } } } } @@ -2714,7 +2741,24 @@ efree(lists); efree(args); } + +/* {{{ proto array array_diff(array arr1, array arr2 [, array ...]) + Returns the entries of arr1 that have values which are not present in any of the +others arguments */ +PHP_FUNCTION(array_diff) +{ + php_array_diff(INTERNAL_FUNCTION_PARAM_PASSTHRU, 0 TSRMLS_CC); +} +/* }}} */ + +/* {{{ proto array array_diff_assoc(array arr1, array arr2 [, array ...]) + Returns the entries of arr1 that have values which are not present in any of the +others arguments but do additional checks whether the keys are equal */ +PHP_FUNCTION(array_diff_assoc) +{ + php_array_diff(INTERNAL_FUNCTION_PARAM_PASSTHRU, 1 TSRMLS_CC); +} /* }}} */ + + #define MULTISORT_ORDER 0 #define MULTISORT_TYPE 1 Index: php4/ext/standard/basic_functions.c diff -u php4/ext/standard/basic_functions.c:1.503 php4/ext/standard/basic_functions.c:1.504 --- php4/ext/standard/basic_functions.c:1.503 Mon Sep 9 06:12:44 2002 +++ php4/ext/standard/basic_functions.c Wed Sep 11 14:13:48 2002 @@ -17,7 +17,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: basic_functions.c,v 1.503 2002/09/09 10:12:44 hyanantha Exp $ */ +/* $Id: basic_functions.c,v 1.504 2002/09/11 18:13:48 andrey Exp $ */ #include "php.h" #include "php_streams.h" @@ -797,6 +797,7 @@ PHP_FE(array_unique, NULL) PHP_FE(array_intersect, NULL) PHP_FE(array_diff, NULL) + PHP_FE(array_diff_assoc, + NULL) PHP_FE(array_sum, NULL) PHP_FE(array_filter, NULL) PHP_FE(array_map, NULL) Index: php4/ext/standard/php_array.h diff -u php4/ext/standard/php_array.h:1.37 php4/ext/standard/php_array.h:1.38 --- php4/ext/standard/php_array.h:1.37 Tue Sep 10 18:36:43 2002 +++ php4/ext/standard/php_array.h Wed Sep 11 14:13:48 2002 @@ -19,7 +19,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: php_array.h,v 1.37 2002/09/10 22:36:43 edink Exp $ */ +/* $Id: php_array.h,v 1.38 2002/09/11 18:13:48 andrey Exp $ */ #ifndef PHP_ARRAY_H #define PHP_ARRAY_H @@ -76,6 +76,7 @@ PHP_FUNCTION(array_unique); PHP_FUNCTION(array_intersect); PHP_FUNCTION(array_diff); +PHP_FUNCTION(array_diff_assoc); PHP_FUNCTION(array_sum); PHP_FUNCTION(array_filter); PHP_FUNCTION(array_map);
-- PHP CVS Mailing List (http://www.php.net/) To unsubscribe, visit: http://www.php.net/unsub.php