I'd share the array_sum() code with array_product() code.. They're identical except for + being * in latter. (I guess you simply copy'pasted it? :)
--Jani
On Wed, 11 May 2005, Andrey Hristov wrote:
andrey Wed May 11 07:43:14 2005 EDT
Modified files: /php-src/ext/standard basic_functions.c php_array.h array.c Log: add function array_product()
http://cvs.php.net/diff.php/php-src/ext/standard/basic_functions.c?r1=1.714&r2=1.715&ty=u Index: php-src/ext/standard/basic_functions.c diff -u php-src/ext/standard/basic_functions.c:1.714 php-src/ext/standard/basic_functions.c:1.715 --- php-src/ext/standard/basic_functions.c:1.714 Tue May 10 08:50:53 2005 +++ php-src/ext/standard/basic_functions.c Wed May 11 07:43:10 2005 @@ -17,7 +17,7 @@ +----------------------------------------------------------------------+ */
-/* $Id: basic_functions.c,v 1.714 2005/05/10 12:50:53 andrey Exp $ */ +/* $Id: basic_functions.c,v 1.715 2005/05/11 11:43:10 andrey Exp $ */
#include "php.h" #include "php_streams.h" @@ -813,6 +813,7 @@ PHP_FE(array_diff_uassoc, NULL) PHP_FE(array_udiff_uassoc, NULL) PHP_FE(array_sum, NULL) + PHP_FE(array_product, NULL) PHP_FE(array_filter, NULL) PHP_FE(array_map, NULL) PHP_FE(array_chunk, NULL) http://cvs.php.net/diff.php/php-src/ext/standard/php_array.h?r1=1.48&r2=1.49&ty=u Index: php-src/ext/standard/php_array.h diff -u php-src/ext/standard/php_array.h:1.48 php-src/ext/standard/php_array.h:1.49 --- php-src/ext/standard/php_array.h:1.48 Mon Nov 1 07:09:46 2004 +++ php-src/ext/standard/php_array.h Wed May 11 07:43:11 2005 @@ -19,7 +19,7 @@ +----------------------------------------------------------------------+ */
-/* $Id: php_array.h,v 1.48 2004/11/01 12:09:46 helly Exp $ */ +/* $Id: php_array.h,v 1.49 2005/05/11 11:43:11 andrey Exp $ */
#ifndef PHP_ARRAY_H #define PHP_ARRAY_H @@ -92,6 +92,7 @@ PHP_FUNCTION(array_diff_uassoc); PHP_FUNCTION(array_udiff_uassoc); PHP_FUNCTION(array_sum); +PHP_FUNCTION(array_product); PHP_FUNCTION(array_filter); PHP_FUNCTION(array_map); PHP_FUNCTION(array_key_exists); http://cvs.php.net/diff.php/php-src/ext/standard/array.c?r1=1.298&r2=1.299&ty=u Index: php-src/ext/standard/array.c diff -u php-src/ext/standard/array.c:1.298 php-src/ext/standard/array.c:1.299 --- php-src/ext/standard/array.c:1.298 Mon Apr 25 02:13:57 2005 +++ php-src/ext/standard/array.c Wed May 11 07:43:11 2005 @@ -21,7 +21,7 @@ +----------------------------------------------------------------------+ */
-/* $Id: array.c,v 1.298 2005/04/25 06:13:57 dmitry Exp $ */ +/* $Id: array.c,v 1.299 2005/05/11 11:43:11 andrey Exp $ */
#include "php.h" #include "php_ini.h" @@ -3918,9 +3918,56 @@ Z_DVAL_P(return_value) += Z_DVAL(entry_n); } } +/* }}} */
+/* {{{ proto mixed array_product(array input) + Returns the product of the array entries */ +PHP_FUNCTION(array_product) +{ + zval **input, + **entry, + entry_n; + int argc = ZEND_NUM_ARGS(); + HashPosition pos; + double dval; + + if (argc != 1 || zend_get_parameters_ex(argc, &input) == FAILURE) { + WRONG_PARAM_COUNT; + } + + if (Z_TYPE_PP(input) != IS_ARRAY) { + php_error_docref(NULL TSRMLS_CC, E_WARNING, "The argument should be an array"); + return; + } + + ZVAL_LONG(return_value, 0); + + for (zend_hash_internal_pointer_reset_ex(Z_ARRVAL_PP(input), &pos); + zend_hash_get_current_data_ex(Z_ARRVAL_PP(input), (void **)&entry, &pos) == SUCCESS; + zend_hash_move_forward_ex(Z_ARRVAL_PP(input), &pos)) { + + if (Z_TYPE_PP(entry) == IS_ARRAY || Z_TYPE_PP(entry) == IS_OBJECT) + continue; + + entry_n = **entry; + zval_copy_ctor(&entry_n); + convert_scalar_to_number(&entry_n TSRMLS_CC); + + if (Z_TYPE(entry_n) == IS_LONG && Z_TYPE_P(return_value) == IS_LONG) { + dval = (double)Z_LVAL_P(return_value) * (double)Z_LVAL(entry_n); + if ( (double)LONG_MIN <= dval && dval <= (double)LONG_MAX ) { + Z_LVAL_P(return_value) *= Z_LVAL(entry_n); + continue; + } + } + convert_to_double(return_value); + convert_to_double(&entry_n); + Z_DVAL_P(return_value) *= Z_DVAL(entry_n); + } +} /* }}} */
+ /* {{{ proto mixed array_reduce(array input, mixed callback [, int initial]) Iteratively reduce the array to a single value via the callback. */ PHP_FUNCTION(array_reduce)
-- Donate @ http://pecl.php.net/wishlist.php/sniper
-- PHP CVS Mailing List (http://www.php.net/) To unsubscribe, visit: http://www.php.net/unsub.php
