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

Reply via email to