summaryrefslogtreecommitdiff
path: root/ext/standard/array.c
diff options
context:
space:
mode:
authorDerick Rethans <derick@php.net>2001-12-29 20:59:59 +0000
committerDerick Rethans <derick@php.net>2001-12-29 20:59:59 +0000
commitcef0a461f941328880415cd7e2b2be745dca162f (patch)
tree3cec04ebfcb757a02a9616a2597db9fd4cf7ae98 /ext/standard/array.c
parent211d712c5910dc8a21e364d53323d9aad0aa3d7e (diff)
downloadphp-git-cef0a461f941328880415cd7e2b2be745dca162f.tar.gz
- Added extra parameter to count() that recursively counts elements in an
array and added is_array_multidimensional(). (patch by Vlad Bosinceanu <glipy@fx.ro>)
Diffstat (limited to 'ext/standard/array.c')
-rw-r--r--ext/standard/array.c53
1 files changed, 38 insertions, 15 deletions
diff --git a/ext/standard/array.c b/ext/standard/array.c
index 653851b4c8..3ce6d17cc0 100644
--- a/ext/standard/array.c
+++ b/ext/standard/array.c
@@ -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 @@ php_array_globals array_globals;
#define CASE_LOWER 0
#define CASE_UPPER 1
+#define COUNT_NORMAL 0
+#define COUNT_RECURSIVE 1
PHP_MINIT_FUNCTION(array)
{
@@ -90,6 +91,9 @@ PHP_MINIT_FUNCTION(array)
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,45 @@ PHP_FUNCTION(ksort)
}
/* }}} */
-/* {{{ proto int count(mixed var)
- Count the number of elements in a variable (usually an array) */
-PHP_FUNCTION(count)
+
+int php_count_recursive(zval *array, long mode)
{
- pval **array;
+ long cnt = 0, i;
+ zval **element;
+
HashTable *target_hash;
+ target_hash = HASH_OF(array);
- if (ZEND_NUM_ARGS() != 1 || 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 (Z_TYPE_P(array) == IS_ARRAY)
+ {
+ cnt += zend_hash_num_elements(target_hash);
+ if (mode == COUNT_RECURSIVE) {
+ for(i = 0; i < zend_hash_num_elements(target_hash); i++) {
+ if (zend_hash_index_find (Z_ARRVAL_P(array), i, (void **) &element) == SUCCESS) {
+ cnt += php_count_recursive(*element, COUNT_RECURSIVE);
+ }
+ }
}
}
+ return cnt;
+}
- RETURN_LONG(zend_hash_num_elements(target_hash));
+/* {{{ proto int count(mixed var [, int mode])
+ Count the number of elements in a variable (usually an array) */
+PHP_FUNCTION(count)
+{
+ zval *array;
+ long mode = COUNT_NORMAL;
+
+ if (zend_parse_parameters (ZEND_NUM_ARGS() TSRMLS_CC, "z|l", &array, &mode) == FAILURE)
+ return;
+
+ if (Z_TYPE_P(array) == IS_ARRAY) {
+ RETURN_LONG (php_count_recursive (array, mode));
+ } else {
+ /* return 1 for non-array arguments */
+ RETURN_LONG(1);
+ }
}
/* }}} */