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;izend_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 - 1.149
+++ array.c 26 Dec 2001 15:39:12 -
@@ -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_RECURSIVE1
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]