Re: cvs: php4 /ext/standard array.c basic_functions.c php_array.h
| From: | Andi Gutmans | Date: | Thu, 12 Sep 2002 04:41:28 +0000 |
| Subject: | Re: cvs: php4 /ext/standard array.c basic_functions.c php_array.h | ||
| References: | 1 | Groups: | php.cvs |
| Request: | Send a blank email to php-cvs+get-14034@lists.php.net to get a copy of this message | ||
You're better off changing the name of behavior to check_if_key_equal and use it as a boolean.
if (check_if_key_equal)
if (!check_if_key_equal)
It'll be much more readable than a magic variable called behavior. If you want to keep the behavior variable you should probably make the 0 and 1 #define's so that people reading the code understand what the different behaviors mean.
Congrats on your first patch :)
Andi
At 06:13 PM 9/11/2002 +0000, Andrey Hristov wrote:
andrey Wed Sep 11 14:13:48 2002 EDTModified files:/php4/ext/standard array.c basic_functions.c php_array.hLog: 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