From: Marcus Boerger Date: Sat, 15 Jul 2006 10:21:10 +0000 (+0000) Subject: - MFH Added array_fill_keys(). (Marcus, Mathew W) X-Git-Tag: php-5.2.0RC1~104 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=87c64280b0b6a03e61dae5a62ece5169f706938d;p=php - MFH Added array_fill_keys(). (Marcus, Mathew W) --- diff --git a/NEWS b/NEWS index f93b623285..e80fb53a59 100644 --- a/NEWS +++ b/NEWS @@ -55,6 +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 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 a0324302d9..76d3e30022 100644 --- a/ext/standard/array.c +++ b/ext/standard/array.c @@ -1720,6 +1720,56 @@ 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) { diff --git a/ext/standard/basic_functions.c b/ext/standard/basic_functions.c index dca64092df..c1a286660a 100644 --- a/ext/standard/basic_functions.c +++ b/ext/standard/basic_functions.c @@ -381,6 +381,12 @@ ZEND_BEGIN_ARG_INFO(arginfo_array_fill, 0) ZEND_ARG_INFO(0, val) ZEND_END_ARG_INFO() +static +ZEND_BEGIN_ARG_INFO(arginfo_array_fill_keys, 0) + ZEND_ARG_INFO(0, keys) /* ARRAY_INFO(0, keys, 0) */ + ZEND_ARG_INFO(0, val) +ZEND_END_ARG_INFO() + static ZEND_BEGIN_ARG_INFO_EX(arginfo_range, 0, 0, 2) ZEND_ARG_INFO(0, low) @@ -3672,6 +3678,7 @@ zend_function_entry basic_functions[] = { PHP_FE(extract, arginfo_extract) PHP_FE(compact, arginfo_compact) PHP_FE(array_fill, arginfo_array_fill) + PHP_FE(array_fill_keys, arginfo_array_fill_keys) PHP_FE(range, arginfo_range) PHP_FE(array_multisort, arginfo_array_multisort) PHP_FE(array_push, arginfo_array_push) diff --git a/ext/standard/php_array.h b/ext/standard/php_array.h index 9f2c1f68f3..b2cbbdb9f2 100644 --- a/ext/standard/php_array.h +++ b/ext/standard/php_array.h @@ -54,6 +54,7 @@ PHP_FUNCTION(array_search); PHP_FUNCTION(extract); PHP_FUNCTION(compact); PHP_FUNCTION(array_fill); +PHP_FUNCTION(array_fill_keys); PHP_FUNCTION(range); PHP_FUNCTION(shuffle); PHP_FUNCTION(array_multisort); diff --git a/ext/standard/tests/array/array_fill_keys.phpt b/ext/standard/tests/array/array_fill_keys.phpt new file mode 100755 index 0000000000..7a9938746c --- /dev/null +++ b/ext/standard/tests/array/array_fill_keys.phpt @@ -0,0 +1,42 @@ +--TEST-- +basic array_fill_keys test +--FILE-- + +--EXPECTF-- + +Warning: array_fill_keys(): First parameter must be an array in %s on line %d +bool(false) +array(0) { +} +array(2) { + ["foo"]=> + NULL + ["bar"]=> + NULL +} +array(4) { + [5]=> + int(123) + ["foo"]=> + int(123) + [10]=> + int(123) + ["1.23"]=> + int(123) +} +array(4) { + ["test"]=> + string(0) "" + [1]=> + string(0) "" + [10]=> + string(0) "" + [100]=> + string(0) "" +}