# [PATCH] Allow mixed $initial in array_reduce

- Thread: https://externals.io/message/36861
- Original archive: https://news-web.php.net/php.internals/36861
- Started by Christian Schneider on 2008-04-08T01:17:32+00:00
- Messages: 6
- Reply by email to internals@lists.php.net
- More for agents: search with https://externals.io/search.md?q={query} · JSON API at https://externals.io/api · documentation at https://externals.io/llms.txt

---

## #36861 — Christian Schneider — 2008-04-08T01:17:32+00:00

URL: https://externals.io/message/36861#36861

I attached a patch and a phpt-file for a small patch to array_reduce  
to allow any type of $initial value. This patch is for HEAD but could  
easily be applied/ported to 5.3.

- Chris

---

## #36916 — Marcus Boerger — 2008-04-10T12:02:01+00:00

URL: https://externals.io/message/36861#36916 · In reply to: #36861

Hello Christian,

  looks good to me. Sidenote: If you cvs add the new test and then do cvs
di -N, then you get the new files and the stuff you changed in one diff.
If you do not have access then a) you need to do the cvs add step
manually by editing the CVS/Entries file and putting in a dummy line for
each new file. And b) you need to find someone to commit this patch to head
first then 5.3.

marcus

Tuesday, April 8, 2008, 3:17:32 AM, you wrote:

> --TEST--
> Test `array_reduce()` function
> --INI--
> precision=14
> --FILE--
> <?php
> /* 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 "\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 ***
> string(23) "quuxfoofoobarquxquxquux"
> string(4) "quux"

> *** Testing `array_reduce()` to array ***
> array(4) {
>   ["foo"]=>
>   int(44)
>   ["bar"]=>
>   int(18)
>   ["qux"]=>
>   int(0)
>   ["quux"]=>
>   int(1)
> }
> array(4) {
>   ["foo"]=>
>   int(42)
>   ["bar"]=>
>   int(17)
>   ["qux"]=>
>   int(-2)
>   ["quux"]=>
>   int(0)
> }

> Done




Best regards,
 Marcus

---

## #39985 — Christian Schneider — 2008-08-16T13:56:27+00:00

URL: https://externals.io/message/36861#39985 · In reply to: #36916

Am 10.04.2008 um 14:02 schrieb Marcus Boerger:
>  looks good to me. Sidenote: If you cvs add the new test and then do  
> cvs
> di -N, then you get the new files and the stuff you changed in one  
> diff.
> If you do not have access then a) you need to do the cvs add step
> manually by editing the CVS/Entries file and putting in a dummy line  
> for
> each new file. And b) you need to find someone to commit this patch  
> to head
> first then 5.3.


I attached a single patch including the changes to array_reduce and a  
test for HEAD, anyone willing to commit it?
And is there any chance of including this in PHP 5.3 at this stage?

- Chris

---

## #39988 — Marcus Boerger — 2008-08-17T09:30:25+00:00

URL: https://externals.io/message/36861#39988 · In reply to: #39985

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--
> +<?php
> +/* 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

---

## #40016 — Lukas Kahwe Smith — 2008-08-20T16:38:15+00:00

URL: https://externals.io/message/36861#40016 · In reply to: #39988

Hey,

Has this been commited yet? Just wanted to give the blessing of the  
two RMs ..

regards,
Lukas



> Hello Christian,
>
>  patch looks good to me :-)
>
> marcus
>
> Saturday, August 16, 2008, 3:56:27 PM, you wrote:
>
> > […]
> +?>>
> > […]
>
>
>
> Best regards,
> Marcus
>
>
> -- 
> 
> 
>

Lukas Kahwe Smith
mls@pooteeweet.org

---

## #40025 — Lars Strojny — 2008-08-20T20:38:45+00:00

URL: https://externals.io/message/36861#40025 · In reply to: #40016

Hi Lukas, hi Christian,

Am Mittwoch, den 20.08.2008, 18:38 +0200 schrieb Lukas Kahwe Smith:
[...]
> Has this been commited yet? Just wanted to give the blessing of the  
> two RMs ..

Committed. Was informed that Christian has a CVS account after I did the
backporting to 5_3. The next time you can commit it by yourself, sorry.

cu, Lars
-- 
   Jabber: lars@strojny.net
   Weblog: http://usrportage.de
