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]