Newsgroups: php.internals Path: news.php.net Xref: news.php.net php.internals:39988 Return-Path: Mailing-List: contact internals-help@lists.php.net; run by ezmlm Delivered-To: mailing list internals@lists.php.net Received: (qmail 85903 invoked from network); 17 Aug 2008 09:30:24 -0000 Received: from unknown (HELO lists.php.net) (127.0.0.1) by localhost with SMTP; 17 Aug 2008 09:30:24 -0000 Authentication-Results: pb1.pair.com smtp.mail=helly@php.net; spf=unknown; sender-id=unknown Authentication-Results: pb1.pair.com header.from=helly@php.net; sender-id=unknown Received-SPF: unknown (pb1.pair.com: domain php.net does not designate 85.214.94.56 as permitted sender) X-PHP-List-Original-Sender: helly@php.net X-Host-Fingerprint: 85.214.94.56 aixcept.net Linux 2.6 Received: from [85.214.94.56] ([85.214.94.56:49939] helo=h1149922.serverkompetenz.net) by pb1.pair.com (ecelerity 2.1.1.9-wez r(12769M)) with ESMTP id F3/D4-43528-FAFE7A84 for ; Sun, 17 Aug 2008 05:30:24 -0400 Received: from surfer-30-2-118.surfnet.iacbox (p4FCFA582.dip0.t-ipconnect.de [79.207.165.130]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (No client certificate requested) by h1149922.serverkompetenz.net (Postfix) with ESMTP id 2E54411FCA0; Sun, 17 Aug 2008 11:30:20 +0200 (CEST) Date: Sun, 17 Aug 2008 11:30:25 +0200 Reply-To: Marcus Boerger X-Priority: 3 (Normal) Message-ID: <1887812365.20080817113025@marcus-boerger.de> To: Christian Schneider CC: PHP Developers Mailing List In-Reply-To: <215985D5-981D-43A2-9D25-34C132F3DC20@cschneid.com> References: <8A963872-3893-4944-A5BF-C227421C095B@cschneid.com> <603701944.20080410140201@marcus-boerger.de> <215985D5-981D-43A2-9D25-34C132F3DC20@cschneid.com> MIME-Version: 1.0 Content-Type: text/plain; charset=iso-8859-15 Content-Transfer-Encoding: 8bit Subject: Re: [PHP-DEV] [PATCH] Allow mixed $initial in array_reduce From: helly@php.net (Marcus Boerger) Hello Christian, patch looks good to me :-) marcus Saturday, August 16, 2008, 3:56:27 PM, you wrote: > ? ext/standard/tests/x > Index: ext/standard/array.c > =================================================================== > RCS file: /repository/php-src/ext/standard/array.c,v > retrieving revision 1.460 > diff -u -r1.460 array.c > --- ext/standard/array.c 10 Aug 2008 17:49:29 -0000 1.460 > +++ ext/standard/array.c 16 Aug 2008 13:52:29 -0000 > @@ -4354,7 +4354,7 @@ > } > /* }}} */ > > -/* {{{ proto mixed array_reduce(array input, mixed callback [, int initial]) U > +/* {{{ proto mixed array_reduce(array input, mixed callback [, mixed initial]) U > Iteratively reduce the array to a single value via the callback. */ > PHP_FUNCTION(array_reduce) > { > @@ -4365,18 +4365,19 @@ > zval *retval; > zend_fcall_info fci; > zend_fcall_info_cache fci_cache = empty_fcall_info_cache; > - long initial; > + zval *initial; > HashPosition pos; > HashTable *htbl; > > - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "af|l", > &input, &fci, &fci_cache, &initial) == FAILURE) { > + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "af|z", > &input, &fci, &fci_cache, &initial) == FAILURE) { > return; > } > > if (ZEND_NUM_ARGS() > 2) { > ALLOC_ZVAL(result); > + *result = *initial; > + zval_copy_ctor(result); > INIT_PZVAL(result); > - ZVAL_LONG(result, initial); > } else { > MAKE_STD_ZVAL(result); > ZVAL_NULL(result); > Index: ext/standard/tests/array/array_reduce.phpt > =================================================================== > RCS file: ext/standard/tests/array/array_reduce.phpt > diff -N ext/standard/tests/array/array_reduce.phpt > --- /dev/null 1 Jan 1970 00:00:00 -0000 > +++ ext/standard/tests/array/array_reduce.phpt 16 Aug 2008 13:52:29 -0000 > @@ -0,0 +1,79 @@ > +--TEST-- > +Test array_reduce() function > +--INI-- > +precision=14 > +--FILE-- > + +/* Prototype: array array_reduce(array $array, mixed $callback, mixed $initial); > + Description: Iteratively reduce the array to a single value via the callback > +*/ > + > +$array = array('foo', 'foo', 'bar', 'qux', 'qux', 'quux'); > + > +echo "\n*** Testing array_reduce() to integer ***\n"; > +function reduce_int($w, $v) { return $w + strlen($v); } > +$initial = 42; > +var_dump(array_reduce($array, 'reduce_int', $initial), $initial); > + > +echo "\n*** Testing array_reduce() to float ***\n"; > +function reduce_float($w, $v) { return $w + strlen($v) / 10; } > +$initial = 4.2; > +var_dump(array_reduce($array, 'reduce_float', $initial), $initial); > + > +echo "\n*** Testing array_reduce() to string ***\n"; > +function reduce_string($w, $v) { return $w . $v; } > +$initial = 'quux'; > +var_dump(array_reduce($array, 'reduce_string', $initial), $initial); > + > +echo "\n*** Testing array_reduce() to array ***\n"; > +function reduce_array($w, $v) { $w[$v]++; return $w; } > +$initial = array('foo' => 42, 'bar' => 17, 'qux' => -2, 'quux' => 0); > +var_dump(array_reduce($array, 'reduce_array', $initial), $initial); > + > +echo "\n*** Testing array_reduce() to null ***\n"; > +function reduce_null($w, $v) { return $w . $v; } > +$initial = null; > +var_dump(array_reduce($array, 'reduce_null', $initial), $initial); > + > +echo "\nDone"; +?>> > +--EXPECTF-- > +*** Testing array_reduce() to integer *** > +int(61) > +int(42) > + > +*** Testing array_reduce() to float *** > +float(6.1) > +float(4.2) > + > +*** Testing array_reduce() to string *** > +unicode(23) "quuxfoofoobarquxquxquux" > +unicode(4) "quux" > + > +*** Testing array_reduce() to array *** > +array(4) { > + [u"foo"]=> > + int(44) > + [u"bar"]=> > + int(18) > + [u"qux"]=> > + int(0) > + [u"quux"]=> > + int(1) > +} > +array(4) { > + [u"foo"]=> > + int(42) > + [u"bar"]=> > + int(17) > + [u"qux"]=> > + int(-2) > + [u"quux"]=> > + int(0) > +} > + > +*** Testing array_reduce() to null *** > +unicode(19) "foofoobarquxquxquux" > +NULL > + > +Done Best regards, Marcus