Index: ext/standard/array.c =================================================================== RCS file: /repository/php-src/ext/standard/array.c,v retrieving revision 1.354 diff -u -r1.354 array.c --- ext/standard/array.c 13 Jul 2006 22:26:42 -0000 1.354 +++ ext/standard/array.c 14 Jul 2006 09:38:08 -0000 @@ -1646,7 +1646,7 @@ Create an array containing num elements starting with index start_key each initialized to val */ PHP_FUNCTION(array_fill) { - zval **start_key, **num, **val, *newval; + zval **start_key, **num, **val; long i; if (ZEND_NUM_ARGS() != 3 || zend_get_parameters_ex(3, &start_key, &num, &val) == FAILURE) { @@ -1654,11 +1654,18 @@ } switch (Z_TYPE_PP(start_key)) { + case IS_LONG: case IS_STRING: case IS_UNICODE: - case IS_LONG: case IS_DOUBLE: - /* allocate an array for return */ + convert_to_long_ex(num); + i = Z_LVAL_PP(num) - 1; + if (i < 0) { + php_error_docref(NULL TSRMLS_CC, E_WARNING, "Number of elements must be positive"); + RETURN_FALSE; + } + + /* Initialize return array */ array_init(return_value); if (PZVAL_IS_REF(*val)) { @@ -1666,7 +1673,7 @@ } convert_to_long_ex(start_key); zval_add_ref(val); - zend_hash_index_update(Z_ARRVAL_P(return_value), Z_LVAL_PP(start_key), val, sizeof(val), NULL); + zend_hash_index_update(Z_ARRVAL_P(return_value), Z_LVAL_PP(start_key), val, sizeof(zval *), NULL); break; default: php_error_docref(NULL TSRMLS_CC, E_WARNING, "Wrong data type for start key"); @@ -1674,18 +1681,63 @@ break; } - convert_to_long_ex(num); - i = Z_LVAL_PP(num) - 1; - if (i < 0) { - zend_hash_destroy(Z_ARRVAL_P(return_value)); - efree(Z_ARRVAL_P(return_value)); - php_error_docref(NULL TSRMLS_CC, E_WARNING, "Number of elements must be positive"); + while (i--) { + zval_add_ref(val); + zend_hash_next_index_insert(Z_ARRVAL_P(return_value), val, sizeof(zval *), NULL); + } +} +/* }}} */ + + +/* {{{ 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; } - newval = *val; - while (i--) { - zval_add_ref(&newval); - zend_hash_next_index_insert(Z_ARRVAL_P(return_value), &newval, sizeof(zval *), NULL); + + if (!zend_hash_num_elements(Z_ARRVAL_PP(keys))) { + php_error_docref(NULL TSRMLS_CC, E_WARNING, "Keys array must have at least 1 element"); + RETURN_FALSE; + } + + /* Initialize return array */ + array_init(return_value); + + 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 || + Z_TYPE_PP(entry) == IS_UNICODE) { + zend_u_symtable_update(Z_ARRVAL_P(return_value), Z_TYPE_PP(entry), Z_UNIVAL_PP(entry), Z_UNILEN_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); } } /* }}} */ Index: ext/standard/basic_functions.c =================================================================== RCS file: /repository/php-src/ext/standard/basic_functions.c,v retrieving revision 1.787 diff -u -r1.787 basic_functions.c --- ext/standard/basic_functions.c 2 Jul 2006 00:10:36 -0000 1.787 +++ ext/standard/basic_functions.c 14 Jul 2006 09:44:20 -0000 @@ -380,6 +380,12 @@ 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) ZEND_ARG_INFO(0, high) @@ -3708,6 +3714,7 @@ 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) Index: ext/standard/php_array.h =================================================================== RCS file: /repository/php-src/ext/standard/php_array.h,v retrieving revision 1.54 diff -u -r1.54 php_array.h --- ext/standard/php_array.h 3 Jun 2006 18:58:40 -0000 1.54 +++ ext/standard/php_array.h 14 Jul 2006 09:41:30 -0000 @@ -54,6 +54,7 @@ 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);