]> granicus.if.org Git - php/commitdiff
- MFH: Added new boolean (fourth) parameter to array_slice() that turns on the
authorDerick Rethans <derick@php.net>
Wed, 15 Sep 2004 11:51:56 +0000 (11:51 +0000)
committerDerick Rethans <derick@php.net>
Wed, 15 Sep 2004 11:51:56 +0000 (11:51 +0000)
  preservation of keys in the returned array.

NEWS
ext/standard/array.c

diff --git a/NEWS b/NEWS
index 9acc9dfbd46922966d21235cdbc6bf6afd23baa3..2085bd5164cb6269733f2bf2b0fd9ba21a2d0f7d 100644 (file)
--- 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
index 088ff2b367472b0151885e8cf970b9a0b65b3359..64c5c37f0880ea4dc8b6e3fb7ef50798a250fbbe 100644 (file)
@@ -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++;