iliaa Wed Feb 5 12:56:08 2003 EDT
Modified files:
/php4/ext/standard php_array.h basic_functions.c array.c
Log:
Added array_walk_recursive() function that can apply array_walk recursively
to an array.
Index: php4/ext/standard/php_array.h
diff -u php4/ext/standard/php_array.h:1.41 php4/ext/standard/php_array.h:1.42
--- php4/ext/standard/php_array.h:1.41 Mon Jan 13 13:12:23 2003
+++ php4/ext/standard/php_array.h Wed Feb 5 12:56:08 2003
@@ -19,7 +19,7 @@
+----------------------------------------------------------------------+
*/
-/* $Id: php_array.h,v 1.41 2003/01/13 18:12:23 andrey Exp $ */
+/* $Id: php_array.h,v 1.42 2003/02/05 17:56:08 iliaa Exp $ */
#ifndef PHP_ARRAY_H
#define PHP_ARRAY_H
@@ -39,6 +39,7 @@
PHP_FUNCTION(uasort);
PHP_FUNCTION(uksort);
PHP_FUNCTION(array_walk);
+PHP_FUNCTION(array_walk_recursive);
PHP_FUNCTION(count);
PHP_FUNCTION(end);
PHP_FUNCTION(prev);
Index: php4/ext/standard/basic_functions.c
diff -u php4/ext/standard/basic_functions.c:1.570
php4/ext/standard/basic_functions.c:1.571
--- php4/ext/standard/basic_functions.c:1.570 Mon Feb 3 16:48:36 2003
+++ php4/ext/standard/basic_functions.c Wed Feb 5 12:56:08 2003
@@ -17,7 +17,7 @@
+----------------------------------------------------------------------+
*/
-/* $Id: basic_functions.c,v 1.570 2003/02/03 21:48:36 iliaa Exp $ */
+/* $Id: basic_functions.c,v 1.571 2003/02/05 17:56:08 iliaa Exp $ */
#include "php.h"
#include "php_streams.h"
@@ -813,6 +813,7 @@
PHP_FE(uksort, first_arg_force_ref)
PHP_FE(shuffle, first_arg_force_ref)
PHP_FE(array_walk, first_arg_force_ref)
+ PHP_FE(array_walk_recursive, first_arg_force_ref)
PHP_FE(count,
NULL)
PHP_FE(end, first_arg_force_ref)
PHP_FE(prev, first_arg_force_ref)
Index: php4/ext/standard/array.c
diff -u php4/ext/standard/array.c:1.218 php4/ext/standard/array.c:1.219
--- php4/ext/standard/array.c:1.218 Mon Feb 3 11:57:02 2003
+++ php4/ext/standard/array.c Wed Feb 5 12:56:08 2003
@@ -21,7 +21,7 @@
+----------------------------------------------------------------------+
*/
-/* $Id: array.c,v 1.218 2003/02/03 16:57:02 sniper Exp $ */
+/* $Id: array.c,v 1.219 2003/02/05 17:56:08 iliaa Exp $ */
#include "php.h"
#include "php_ini.h"
@@ -943,7 +943,7 @@
}
/* }}} */
-static int php_array_walk(HashTable *target_hash, zval **userdata TSRMLS_DC)
+static int php_array_walk(HashTable *target_hash, zval **userdata, int recursive
+TSRMLS_DC)
{
zval **args[3], /* Arguments to userland function */
*retval_ptr, /* Return value - unused */
@@ -961,33 +961,44 @@
/* Iterate through hash */
while (zend_hash_get_current_data_ex(target_hash, (void **)&args[0], &pos) ==
SUCCESS) {
- /* Allocate space for key */
- MAKE_STD_ZVAL(key);
-
- /* Set up the key */
- if (zend_hash_get_current_key_ex(target_hash, &string_key,
&string_key_len, &num_key, 0, &pos) == HASH_KEY_IS_LONG) {
- Z_TYPE_P(key) = IS_LONG;
- Z_LVAL_P(key) = num_key;
- } else {
- ZVAL_STRINGL(key, string_key, string_key_len-1, 1);
- }
-
- /* Call the userland function */
- if (call_user_function_ex(EG(function_table), NULL,
*BG(array_walk_func_name),
- &retval_ptr, userdata ? 3 : 2,
args, 0, NULL TSRMLS_CC) == SUCCESS) {
-
- zval_ptr_dtor(&retval_ptr);
+ if (recursive && Z_TYPE_PP(args[0]) == IS_ARRAY) {
+ HashTable *thash;
+
+ thash = HASH_OF(*(args[0]));
+ if (thash == target_hash) {
+ php_error_docref(NULL TSRMLS_CC, E_WARNING, "recursion
+detected");
+ return 0;
+ }
+ php_array_walk(thash, userdata, recursive TSRMLS_CC);
} else {
- char *func_name;
+ /* Allocate space for key */
+ MAKE_STD_ZVAL(key);
- if (zend_is_callable(*BG(array_walk_func_name), 0,
&func_name)) {
- php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unable to
call %s()", func_name);
+ /* Set up the key */
+ if (zend_hash_get_current_key_ex(target_hash, &string_key,
+&string_key_len, &num_key, 0, &pos) == HASH_KEY_IS_LONG) {
+ Z_TYPE_P(key) = IS_LONG;
+ Z_LVAL_P(key) = num_key;
} else {
- php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unable to
call %s() - function does not exist", func_name);
+ ZVAL_STRINGL(key, string_key, string_key_len-1, 1);
}
+
+ /* Call the userland function */
+ if (call_user_function_ex(EG(function_table), NULL,
+*BG(array_walk_func_name),
+ &retval_ptr, userdata ? 3 :
+2, args, 0, NULL TSRMLS_CC) == SUCCESS) {
+
+ zval_ptr_dtor(&retval_ptr);
+ } else {
+ char *func_name;
- efree(func_name);
- break;
+ if (zend_is_callable(*BG(array_walk_func_name), 0,
+&func_name)) {
+ php_error_docref(NULL TSRMLS_CC, E_WARNING,
+"Unable to call %s()", func_name);
+ } else {
+ php_error_docref(NULL TSRMLS_CC, E_WARNING,
+"Unable to call %s() - function does not exist", func_name);
+ }
+
+ efree(func_name);
+ break;
+ }
}
zval_ptr_dtor(&key);
@@ -1026,11 +1037,46 @@
BG(array_walk_func_name) = old_walk_func_name;
RETURN_FALSE;
}
- php_array_walk(target_hash, userdata TSRMLS_CC);
+ php_array_walk(target_hash, userdata, 0 TSRMLS_CC);
+ BG(array_walk_func_name) = old_walk_func_name;
+ RETURN_TRUE;
+}
+/* }}} */
+
+/* {{{ proto bool array_walk_recursive(array input, string funcname [, mixed
+userdata])
+ Apply a user function recursively to every member of an array */
+PHP_FUNCTION(array_walk_recursive)
+{
+ int argc;
+ zval **array,
+ **userdata = NULL,
+ **old_walk_func_name;
+ HashTable *target_hash;
+
+ argc = ZEND_NUM_ARGS();
+ old_walk_func_name = BG(array_walk_func_name);
+ if (argc < 2 || argc > 3 ||
+ zend_get_parameters_ex(argc, &array, &BG(array_walk_func_name),
+&userdata) == FAILURE) {
+ BG(array_walk_func_name) = old_walk_func_name;
+ WRONG_PARAM_COUNT;
+ }
+ target_hash = HASH_OF(*array);
+ if (!target_hash) {
+ php_error_docref(NULL TSRMLS_CC, E_WARNING, "The argument should be an
+array");
+ BG(array_walk_func_name) = old_walk_func_name;
+ RETURN_FALSE;
+ }
+ if (Z_TYPE_PP(BG(array_walk_func_name)) != IS_ARRAY &&
+Z_TYPE_PP(BG(array_walk_func_name)) != IS_STRING) {
+ php_error_docref(NULL TSRMLS_CC, E_WARNING, "Wrong syntax for function
+name");
+ BG(array_walk_func_name) = old_walk_func_name;
+ RETURN_FALSE;
+ }
+ php_array_walk(target_hash, userdata, 1 TSRMLS_CC);
BG(array_walk_func_name) = old_walk_func_name;
RETURN_TRUE;
}
/* }}} */
+
/* void php_search_array(INTERNAL_FUNCTION_PARAMETERS, int behavior)
* 0 = return boolean
--
PHP CVS Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php