Re: [RFC] Saner array_(sum|product)()
| From: | Derick Rethans | Date: | Wed, 18 Jan 2023 15:06:42 +0000 |
| Subject: | Re: [RFC] Saner array_(sum|product)() | ||
| References: | 1 | Groups: | php.internals |
| Request: | Send a blank email to internals+get-119310@lists.php.net to get a copy of this message | ||
On Tue, 17 Jan 2023, G. P. B. wrote:
> I would like to start the discussion about the Saner
> array_(sum|product)() RFC:
> https://wiki.php.net/rfc/saner-array-sum-product
>
> Currently, the array_sum() and array_product() behave differently than
> their userland implementation as they ignore arrays and objects, and
> cast the remaining types to int/float. This is in contrast with the
> behaviour of arithmetic operators that throw TypeErrors on types and
> values that are not interpretable as int/float.
>
> This RFC aims to resolve this discrepancy.
I think I agree with the premise of this RFC, but I do think a few
details are wrongly addressed.
First of all, a clarification why this produces int(4) would be useful:
$input = [true, STDERR, new stdClass(), [], gmp_init(6)];
$output = array_sum($input);
I had to look up that STDERR would cast to int(3) :-)
I don't understand why this would result in a warning and a return of
int(50):
$a = [10, 15.6, gmp_init(25)];
var_dump(array_sum($a));
Why doesn't this return float(50.6) instead? I realise that the
array_reduce variant (below) does the same, but it's not what I would
expect:
<?php
$input = [10, 15.6, gmp_init(25)];
$output = array_reduce($input, fn($carry, $value) => $carry + $value, 0);
I think the phrase "If traversing the array transforms the return value
into an object, if that object is not numerically castable an E_WARNING
is emitted and the initial return value is returned instead, which may
change the return value if scalar values were present in the array. "
should come with an example :-)
cheers,
Derick