Hacked count() to count all the elements in an array in a recursive manner.
It takes two arguments; the second is optional, and can be one of 
COUNT_NORMAL (good old count) or COUNT_RECURSIVE.

- Vlad
Index: zend_hash.c
===================================================================
RCS file: /repository/Zend/zend_hash.c,v
retrieving revision 1.82
diff -u -r1.82 zend_hash.c
--- zend_hash.c 2001/12/04 17:56:19     1.82
+++ zend_hash.c 2001/12/26 15:42:00
@@ -19,13 +19,14 @@
 
 
 #include "zend.h"
+#include "zend_operators.h"
 
 #include <stdio.h>
 
 #ifdef HAVE_STDLIB_H
 # include <stdlib.h>
 #endif
-
+#include "zend_API.h"
 #define HANDLE_NUMERIC(key, length, func) {                                           
                                                 \
        register char *tmp=key;                                                        
                                                                 \
                                                                                       
                                                                                       
  \
@@ -1257,6 +1258,30 @@
        return SUCCESS;
 }
 
+ZEND_API int zend_hash_count_recursive(zval **array, zval **mode)
+{
+       long cnt = 0, i;
+       zval **element;
+    HashTable *target_hash;
+       target_hash = HASH_OF(*array);
+       if(Z_TYPE_PP(array)==IS_ARRAY && Z_LVAL_PP(mode)==1)
+       {
+               cnt += zend_hash_num_elements(target_hash);
+               for(i=0;i<zend_hash_num_elements(target_hash);i++)
+               {
+                       if(zend_hash_index_find(Z_ARRVAL_PP(array), i, (void **) 
+&element)==SUCCESS)
+                       {
+                               (*mode)->type = IS_LONG;
+                               (*mode)->value.lval = 1;
+                               cnt += zend_hash_count_recursive(element, mode);
+                       }
+               }
+       }
+       else if(Z_TYPE_PP(array)==IS_ARRAY && Z_LVAL_PP(mode)==0)
+               cnt += zend_hash_num_elements(target_hash);
+       return cnt;
+}
+       
 ZEND_API ulong zend_hash_next_free_element(HashTable *ht)
 {
        IS_CONSISTENT(ht);
Index: array.c
===================================================================
RCS file: /repository/php4/ext/standard/array.c,v
retrieving revision 1.149
diff -u -r1.149 array.c
--- array.c     22 Dec 2001 11:49:56 -0000      1.149
+++ array.c     26 Dec 2001 15:39:12 -0000
@@ -25,7 +25,6 @@
 
 #include "php.h"
 #include "php_ini.h"
-#include "zend_operators.h"
 #include <stdarg.h>
 #include <stdlib.h>
 #include <math.h>
@@ -68,6 +67,8 @@
 #define CASE_LOWER          0
 #define CASE_UPPER          1
 
+#define COUNT_NORMAL           0
+#define COUNT_RECURSIVE                1
 
 PHP_MINIT_FUNCTION(array)
 {
@@ -90,6 +91,9 @@
        REGISTER_LONG_CONSTANT("CASE_LOWER", CASE_LOWER, CONST_CS | CONST_PERSISTENT);
        REGISTER_LONG_CONSTANT("CASE_UPPER", CASE_UPPER, CONST_CS | CONST_PERSISTENT);
 
+       REGISTER_LONG_CONSTANT("COUNT_NORMAL", COUNT_NORMAL, CONST_CS | 
+CONST_PERSISTENT);
+       REGISTER_LONG_CONSTANT("COUNT_RECURSIVE", COUNT_RECURSIVE, CONST_CS | 
+CONST_PERSISTENT);
+       
        return SUCCESS;
 }
 
@@ -223,26 +227,27 @@
 }
 /* }}} */
 
-/* {{{ proto int count(mixed var)
+/* {{{ proto int count(mixed var [, int mode])
    Count the number of elements in a variable (usually an array) */
 PHP_FUNCTION(count)
 {
-       pval **array;
-       HashTable *target_hash;
+       pval **array, **mode;
 
-       if (ZEND_NUM_ARGS() != 1 || zend_get_parameters_ex(1, &array) == FAILURE) {
+       if (ZEND_NUM_ARGS() < 1 || ZEND_NUM_ARGS() > 2 || zend_get_parameters_ex(1, 
+&array) == FAILURE) {
                WRONG_PARAM_COUNT;
        }
-       target_hash = HASH_OF(*array);
-       if (!target_hash) {
-               if (Z_TYPE_PP(array) == IS_NULL) {
-                       RETURN_LONG(0);
-               } else {
-                       RETURN_LONG(1);
-               }
+       if(ZEND_NUM_ARGS() == 2) {
+               zend_get_parameters_ex(2, &array, &mode);
+       } else {
+               (*mode)->type = IS_LONG;
+               (*mode)->value.lval = 1;
+       }
+       if(Z_TYPE_PP(array)==IS_ARRAY) {
+               RETURN_LONG(zend_hash_count_recursive(array, mode));
+       } else {
+               /* return 1 for non-array arguments */
+               RETURN_LONG(1);
        }
-
-       RETURN_LONG(zend_hash_num_elements(target_hash));
 }
 /* }}} */
 

-- 
PHP Development Mailing List <http://www.php.net/>
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]
To contact the list administrators, e-mail: [EMAIL PROTECTED]

Reply via email to