Re: cvs: php4 /ext/standard array.c basic_functions.c php_array.h

From: 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 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


« previous php.cvs (#14034) next »