]> granicus.if.org Git - php/commitdiff
@- Added array_filter(), which allows filtering of array elements via
authorAndrei Zmievski <andrei@php.net>
Fri, 16 Mar 2001 20:46:33 +0000 (20:46 +0000)
committerAndrei Zmievski <andrei@php.net>
Fri, 16 Mar 2001 20:46:33 +0000 (20:46 +0000)
@  the specified callback. (Andrei)

ext/standard/array.c
ext/standard/basic_functions.c
ext/standard/php_array.h

index 6da53227fed8507e7bd2368e648bdb3168789281..6b7333944637a96162d2becc314b67e4fe6008e7 100644 (file)
@@ -2887,6 +2887,82 @@ PHP_FUNCTION(array_reduce)
        
        *return_value = *result;
 }
+/* }}} */
+
+
+/* {{{ proto array array_filter(array input [, mixed callback])
+   Filters elements from the array via the callback. */
+PHP_FUNCTION(array_filter)
+{
+       zval **input, **callback = NULL;
+       zval **operand;
+       zval **args[1];
+       zval *retval = NULL;
+       char *callback_name;
+       char *string_key;
+       ulong string_key_len;
+       ulong num_key;
+       HashPosition pos;
+       
+       if (ZEND_NUM_ARGS() < 1 || ZEND_NUM_ARGS() > 2 ||
+               zend_get_parameters_ex(ZEND_NUM_ARGS(), &input, &callback) == FAILURE) {
+               WRONG_PARAM_COUNT;
+       }
+
+       if (Z_TYPE_PP(input) != IS_ARRAY) {
+               php_error(E_WARNING, "%s() expects argument 1 to be an array",
+                                 get_active_function_name());
+               return;
+       }
+
+       if (ZEND_NUM_ARGS() > 1) {
+               if (!zend_is_callable(*callback, 0, &callback_name)) {
+                       php_error(E_WARNING, "%s() expects argument 2, '%s', to be a valid callback",
+                                         get_active_function_name(), callback_name);
+                       efree(callback_name);
+                       return;
+               }
+       }
+
+       array_init(return_value);
+       if (zend_hash_num_elements(Z_ARRVAL_PP(input)) == 0)
+               return;
+
+       for (zend_hash_internal_pointer_reset_ex(Z_ARRVAL_PP(input), &pos);
+                zend_hash_get_current_data_ex(Z_ARRVAL_PP(input), (void **)&operand, &pos) == SUCCESS;
+                zend_hash_move_forward_ex(Z_ARRVAL_PP(input), &pos)) {
+
+               if (callback) {
+                       args[0] = operand;
+                       if (call_user_function_ex(EG(function_table), NULL, *callback, &retval, 1, args, 0, NULL) == SUCCESS && retval) {
+                               if (!zend_is_true(retval)) {
+                                       zval_ptr_dtor(&retval);
+                                       continue;
+                               } else
+                                       zval_ptr_dtor(&retval);
+                       } else {
+                               php_error(E_WARNING, "%s() had an error invoking the reduction callback", get_active_function_name());
+                               return;
+                       }
+               } else if (!zend_is_true(*operand))
+                       continue;
+
+               zval_add_ref(operand);
+               switch (zend_hash_get_current_key_ex(Z_ARRVAL_PP(input), &string_key, &string_key_len, &num_key, 0, &pos)) {
+                       case HASH_KEY_IS_STRING:
+                               zend_hash_update(Z_ARRVAL_P(return_value), string_key,
+                                                                string_key_len, operand, sizeof(zval *), NULL);
+                               break;
+
+                       case HASH_KEY_IS_LONG:
+                               zend_hash_index_update(Z_ARRVAL_P(return_value), num_key,
+                                                                          operand, sizeof(zval *), NULL);
+                               break;
+               }
+       }
+}
+/* }}} */
+
 
 /*
  * Local variables:
index d0c3b6d3154b73d962d60ba3bc63af9beefed063..f8a1fca45ac2a278192b4b0d87648fc83abc90b6 100644 (file)
@@ -581,6 +581,7 @@ function_entry basic_functions[] = {
        PHP_FE(array_intersect,                                                 NULL)
        PHP_FE(array_diff,                                                          NULL)
        PHP_FE(array_sum,                                                           NULL)
+       PHP_FE(array_filter,                                                NULL)
 
        /* aliases from array.c */
        PHP_FALIAS(pos,                         current,                        first_arg_force_ref)
index b38209d6f571cd6b14cd1abce80128e08bd40c42..226574df92b6bcb36a5a43628bd457ce66a4af0b 100644 (file)
@@ -75,6 +75,7 @@ PHP_FUNCTION(array_unique);
 PHP_FUNCTION(array_intersect);
 PHP_FUNCTION(array_diff);
 PHP_FUNCTION(array_sum);
+PHP_FUNCTION(array_filter);
 
 HashTable* php_splice(HashTable *, int, int, zval ***, int, HashTable **);
 PHPAPI void php_array_merge(HashTable *dest, HashTable *src, int recursive);