From: Marcus Boerger Date: Sat, 15 Jul 2006 12:14:07 +0000 (+0000) Subject: - MFH array_fill_keys, better unicode support, use new param parsing API X-Git-Tag: php-5.2.0RC1~103 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=31a8d6a6b31c46cb5f80d46677b7d3d126ce535a;p=php - MFH array_fill_keys, better unicode support, use new param parsing API --- diff --git a/NEWS b/NEWS index e80fb53a59..a4ae2ba9f8 100644 --- a/NEWS +++ b/NEWS @@ -55,7 +55,7 @@ PHP NEWS . Added readInnerXML(), readOuterXML(), readString(), setSchema(). (2.6.20+) . Changed to passing libxml options when loading reader. -- Added array_fill_keys(). (Marcus, Mathew W) +- Added array_fill_keys(). (Marcus, Matthew Wilmas) - Added posix_initgroups() function. (Ilia) - Added an optional parameter to parse_url() to allow retrieval of distinct URL components. (Ilia) diff --git a/ext/standard/array.c b/ext/standard/array.c index 76d3e30022..33c4c50d3d 100644 --- a/ext/standard/array.c +++ b/ext/standard/array.c @@ -1579,6 +1579,49 @@ PHP_FUNCTION(array_fill) } /* }}} */ +/* {{{ proto array array_fill_keys(array keys, mixed val) + Create an array using the elements of the first parameter as keys each initialized to val */ +PHP_FUNCTION(array_fill_keys) +{ + zval *keys, *val, **entry; + HashPosition pos; + + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "az", &keys, &val) == FAILURE) { + return; + } + + /* Initialize return array */ + array_init(return_value); + + zend_hash_internal_pointer_reset_ex(Z_ARRVAL_P(keys), &pos); + while (zend_hash_get_current_data_ex(Z_ARRVAL_P(keys), (void **)&entry, &pos) == SUCCESS) { + + if (Z_TYPE_PP(entry) == IS_LONG) { + zval_add_ref(&val); + zend_hash_index_update(Z_ARRVAL_P(return_value), Z_LVAL_PP(entry), &val, sizeof(zval *), NULL); + } else { + zval key, *key_ptr = *entry; + + if (Z_TYPE_PP(entry) != IS_STRING) { + key = **entry; + zval_copy_ctor(&key); + convert_to_string(&key); + key_ptr = &key; + } + + zval_add_ref(&val); + zend_symtable_update(Z_ARRVAL_P(return_value), Z_STRVAL_P(key_ptr), Z_STRLEN_P(key_ptr) + 1, &val, sizeof(zval *), NULL); + + if (key_ptr != *entry) { + zval_dtor(&key); + } + } + + zend_hash_move_forward_ex(Z_ARRVAL_P(keys), &pos); + } +} +/* }}} */ + /* {{{ proto array range(mixed low, mixed high[, int step]) Create an array containing the range of integers or characters from low to high (inclusive) */ PHP_FUNCTION(range) @@ -1720,57 +1763,6 @@ err: } /* }}} */ -/* {{{ proto array array_fill_keys(array keys, mixed val) - Create an array using the elements of the first parameter as keys each initialized to val */ -PHP_FUNCTION(array_fill_keys) -{ - zval **keys, **val, **entry; - HashPosition pos; - - if (ZEND_NUM_ARGS() != 2 || zend_get_parameters_ex(2, &keys, &val) == FAILURE) { - WRONG_PARAM_COUNT; - } - - if (Z_TYPE_PP(keys) != IS_ARRAY) { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "First parameter must be an array"); - RETURN_FALSE; - } - - /* Initialize return array */ - array_init(return_value); - - if (!zend_hash_num_elements(Z_ARRVAL_PP(keys))) { - return; - } - - if (PZVAL_IS_REF(*val)) { - SEPARATE_ZVAL(val); - } - - zend_hash_internal_pointer_reset_ex(Z_ARRVAL_PP(keys), &pos); - while (zend_hash_get_current_data_ex(Z_ARRVAL_PP(keys), (void **)&entry, &pos) == SUCCESS) { - zval_add_ref(val); - - if (Z_TYPE_PP(entry) == IS_STRING) { - zend_symtable_update(Z_ARRVAL_P(return_value), Z_STRVAL_PP(entry), Z_STRLEN_PP(entry) + 1, val, sizeof(zval *), NULL); - } else if (Z_TYPE_PP(entry) == IS_LONG) { - zend_hash_index_update(Z_ARRVAL_P(return_value), Z_LVAL_PP(entry), val, sizeof(zval *), NULL); - } else { - zval tmpkey; - - tmpkey = **entry; - zval_copy_ctor(&tmpkey); - convert_to_string(&tmpkey); - - zend_symtable_update(Z_ARRVAL_P(return_value), Z_STRVAL(tmpkey), Z_STRLEN(tmpkey) + 1, val, sizeof(zval *), NULL); - - zval_dtor(&tmpkey); - } - zend_hash_move_forward_ex(Z_ARRVAL_PP(keys), &pos); - } -} -/* }}} */ - static void array_data_shuffle(zval *array TSRMLS_DC) { Bucket **elems, *temp; diff --git a/ext/standard/tests/array/array_fill_keys.phpt b/ext/standard/tests/array/array_fill_keys.phpt index 7a9938746c..65c38234cd 100755 --- a/ext/standard/tests/array/array_fill_keys.phpt +++ b/ext/standard/tests/array/array_fill_keys.phpt @@ -10,8 +10,8 @@ basic array_fill_keys test ?> --EXPECTF-- -Warning: array_fill_keys(): First parameter must be an array in %s on line %d -bool(false) +Warning: array_fill_keys() expects parameter 1 to be array, string given in %s on line %d +NULL array(0) { } array(2) {