From: Derick Rethans Date: Wed, 15 Sep 2004 11:51:56 +0000 (+0000) Subject: - MFH: Added new boolean (fourth) parameter to array_slice() that turns on the X-Git-Tag: php-5.0.2RC1~10 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=9782bbd2972826e2ae8653b613ed58451372d610;p=php - MFH: Added new boolean (fourth) parameter to array_slice() that turns on the preservation of keys in the returned array. --- diff --git a/NEWS b/NEWS index 9acc9dfbd4..2085bd5164 100644 --- a/NEWS +++ b/NEWS @@ -1,6 +1,8 @@ PHP NEWS ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| ?? ??? 2004, PHP 5.0.2 +- Added new boolean (fourth) parameter to array_slice() that turns on the + preservation of keys in the returned array. (Derick) - Added the sorting flag SORT_LOCALE_STRING to the sort() functions which makes them sort based on the current locale. (Derick) - Added interface_exists() and make class_exists() only return true for real diff --git a/ext/standard/array.c b/ext/standard/array.c index 088ff2b367..64c5c37f08 100644 --- a/ext/standard/array.c +++ b/ext/standard/array.c @@ -2090,7 +2090,8 @@ PHP_FUNCTION(array_slice) zval **input, /* Input array */ **offset, /* Offset to get elements from */ **length, /* How many elements to get */ - **entry; /* An array entry */ + **entry, /* An array entry */ + **z_preserve_keys; /* Whether to preserve keys while copying to the new array or not */ int offset_val, /* Value of the offset argument */ length_val, /* Value of the length argument */ num_in, /* Number of elements in the input array */ @@ -2101,10 +2102,11 @@ PHP_FUNCTION(array_slice) uint string_key_len; ulong num_key; HashPosition hpos; + zend_bool preserve_keys = 0; /* Get the arguments and do error-checking */ argc = ZEND_NUM_ARGS(); - if (argc < 2 || argc > 3 || zend_get_parameters_ex(argc, &input, &offset, &length)) { + if (argc < 2 || argc > 4 || zend_get_parameters_ex(argc, &input, &offset, &length, &z_preserve_keys)) { WRONG_PARAM_COUNT; } @@ -2118,12 +2120,17 @@ PHP_FUNCTION(array_slice) is not passed */ convert_to_long_ex(offset); offset_val = Z_LVAL_PP(offset); - if (argc == 3) { + if (argc >= 3) { convert_to_long_ex(length); length_val = Z_LVAL_PP(length); } else { length_val = zend_hash_num_elements(Z_ARRVAL_PP(input)); } + + if (ZEND_NUM_ARGS() > 3) { + convert_to_boolean_ex(z_preserve_keys); + preserve_keys = Z_BVAL_PP(z_preserve_keys); + } /* Initialize returned array */ array_init(return_value); @@ -2167,8 +2174,12 @@ PHP_FUNCTION(array_slice) break; case HASH_KEY_IS_LONG: - zend_hash_next_index_insert(Z_ARRVAL_P(return_value), - entry, sizeof(zval *), NULL); + if (preserve_keys) + zend_hash_index_update(Z_ARRVAL_P(return_value), num_key, + entry, sizeof(zval *), NULL); + else + zend_hash_next_index_insert(Z_ARRVAL_P(return_value), + entry, sizeof(zval *), NULL); break; } pos++;