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