Since there didn't seem to be anyone who disagreed on the odd
behaviour of array_combine() with empty arrays as arguments, I've
written up a patch for this and attached it to the existing feature
change/request report:

Report: http://bugs.php.net/bug.php?id=34857
Patch: http://paste.roguecoders.com/p/16e1e953e8b1890bcaaba00eb8408dd7.txt

If someone with the appropriate karma could review this and commit it
to trunk, that would be grand.

Thanks,
Joël.

On Fri, Jul 16, 2010 at 5:52 AM, Richard Quadling <rquadl...@gmail.com> wrote:
> On 16 July 2010 02:42, Joel Perras <joel.per...@gmail.com> wrote:
>> array_combine(array(), array()) triggers an E_WARNING and returns
>> false, instead of simply returning an empty array with no triggered
>> warning.
>>
>> This is not a bug, but was intentionally written as such - see
>> ext/standard/array.c around lines 4480-4483 in the 5.3 branch in the
>> current svn HEAD:
>>
>>
>> PHP_FUNCTION(array_combine)
>> {
>>        zval *values, *keys;
>>        HashPosition pos_values, pos_keys;
>>        zval **entry_keys, **entry_values;
>>        int num_keys, num_values;
>>
>>        if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "aa", &keys,
>> &values) == FAILURE) {
>>                return;
>>        }
>>
>>        num_keys = zend_hash_num_elements(Z_ARRVAL_P(keys));
>>        num_values = zend_hash_num_elements(Z_ARRVAL_P(values));
>>
>>        if (num_keys != num_values) {
>>                php_error_docref(NULL TSRMLS_CC, E_WARNING, "Both parameters 
>> should
>> have an equal number of elements");
>>                RETURN_FALSE;
>>        }
>>
>>        if (!num_keys) {
>>                php_error_docref(NULL TSRMLS_CC, E_WARNING, "Both parameters 
>> should
>> have at least 1 element");
>>                RETURN_FALSE;
>>        }
>>
>> // [snip]
>>
>>
>> There is currently one open ticket regarding this behaviour
>> (http://bugs.php.net/bug.php?id=34857) from 2005, as well as a ticket
>> that was closed, stating that the incorrect E_WARNING message was
>> fixed (http://bugs.php.net/bug.php?id=29972). This behaviour is also
>> documented on http://php.net/array_combine .
>>
>> So, it's easy to see that this has been around for a while. However, I
>> don't think this behaviour is intuitive or very logical. Am I missing
>> something obvious?
>>
>> Thanks,
>> Joël.
>>
>> P.S.
>> I've searched back to about 2004 in the php-internals list to see if
>> this topic has come up before, but came up empty. If this has already
>> been discussed ad nauseam, could someone please link me to the
>> relevant posts?
>>
>> --
>> I do know everything, just not all at once. It's a virtual memory problem.
>>
>> --
>> PHP Internals - PHP Runtime Development Mailing List
>> To unsubscribe, visit: http://www.php.net/unsub.php
>>
>>
>
> [1] contains the initial submission of this function.
>
> It was commited on Jan 13 18:12:23 2003 UTC (7 years, 6 months ago) by andrey
>
> "added array_combine().
> Creates an array by using the elements of the first parameter as keys and
> the elements of the second as correspoding keys. Error is thrown in case
> the arrays has different number of elements. Number of elements 0 is not
> valid for both parameters."
>
> As a lurker here, generating an error does seem odd. It forces
> addition userland work for seemingly no benefit.
>
> So a +1 for array() === array_combine(array(), array())
>
> Regards,
>
> Richard.
>
> [1] http://svn.php.net/viewvc?view=revision&revision=111688
>



-- 
I do know everything, just not all at once. It's a virtual memory problem.
You should follow me on Twitter: http://twitter.com/jperras

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

Reply via email to