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

? 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


-- 
PHP Internals - PHP Runtime Development Mailing List
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to