From: Xinchen Hui Date: Fri, 16 Jan 2015 09:54:50 +0000 (+0800) Subject: Optimized array_slice X-Git-Tag: PRE_PHP7_REMOVALS~25^2~123 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=865749e7b15176e5f601d7a4a35f18b829fdc5c2;p=php Optimized array_slice --- diff --git a/ext/standard/array.c b/ext/standard/array.c index ae56fd4957..5662dee8ff 100644 --- a/ext/standard/array.c +++ b/ext/standard/array.c @@ -2367,26 +2367,43 @@ PHP_FUNCTION(array_slice) /* Start at the beginning and go until we hit offset */ pos = 0; - ZEND_HASH_FOREACH_KEY_VAL(Z_ARRVAL_P(input), num_key, string_key, entry) { - pos++; - if (pos <= offset) { - continue; - } - if (pos > offset + length) { - break; - } + if (!preserve_keys && (Z_ARRVAL_P(input)->u.flags & HASH_FLAG_PACKED)) { + zend_hash_real_init(Z_ARRVAL_P(return_value), 1); + ZEND_HASH_FILL_PACKED(Z_ARRVAL_P(return_value)) { + ZEND_HASH_FOREACH_NUM_KEY_VAL(Z_ARRVAL_P(input), num_key, entry) { + pos++; + if (pos <= offset) { + continue; + } + if (pos > offset + length) { + break; + } + ZEND_HASH_FILL_ADD(entry); + zval_add_ref(entry); + } ZEND_HASH_FOREACH_END(); + } ZEND_HASH_FILL_END(); + } else { + ZEND_HASH_FOREACH_KEY_VAL(Z_ARRVAL_P(input), num_key, string_key, entry) { + pos++; + if (pos <= offset) { + continue; + } + if (pos > offset + length) { + break; + } - if (string_key) { - entry = zend_hash_add_new(Z_ARRVAL_P(return_value), string_key, entry); - } else { - if (preserve_keys) { - entry = zend_hash_index_add_new(Z_ARRVAL_P(return_value), num_key, entry); + if (string_key) { + entry = zend_hash_add_new(Z_ARRVAL_P(return_value), string_key, entry); } else { - entry = zend_hash_next_index_insert_new(Z_ARRVAL_P(return_value), entry); + if (preserve_keys) { + entry = zend_hash_index_add_new(Z_ARRVAL_P(return_value), num_key, entry); + } else { + entry = zend_hash_next_index_insert_new(Z_ARRVAL_P(return_value), entry); + } } - } - zval_add_ref(entry); - } ZEND_HASH_FOREACH_END(); + zval_add_ref(entry); + } ZEND_HASH_FOREACH_END(); + } } /* }}} */