From be00b4ed13819b464f77c6dc6f72734f34e5bcc6 Mon Sep 17 00:00:00 2001 From: Xinchen Hui Date: Wed, 3 Aug 2016 12:06:04 +0800 Subject: [PATCH] Optmized array_rand --- ext/standard/array.c | 28 +++++++++++++++++----------- 1 file changed, 17 insertions(+), 11 deletions(-) diff --git a/ext/standard/array.c b/ext/standard/array.c index e76eee3aaf..d07e8c6d45 100644 --- a/ext/standard/array.c +++ b/ext/standard/array.c @@ -5177,19 +5177,25 @@ PHP_FUNCTION(array_rand) i--; } } + /* i = 0; */ - /* We can't use zend_hash_index_find() because the array may have string keys or gaps. */ - i = 0; - ZEND_HASH_FOREACH_KEY(Z_ARRVAL_P(input), num_key, string_key) { - if (zend_bitset_in(bitset, i) ^ negative_bitset) { - if (string_key) { - add_next_index_str(return_value, zend_string_copy(string_key)); - } else { - add_next_index_long(return_value, num_key); + zend_hash_real_init(Z_ARRVAL_P(return_value), 1); + ZEND_HASH_FILL_PACKED(Z_ARRVAL_P(return_value)) { + zval zv; + /* We can't use zend_hash_index_find() + * because the array may have string keys or gaps. */ + ZEND_HASH_FOREACH_KEY(Z_ARRVAL_P(input), num_key, string_key) { + if (zend_bitset_in(bitset, i) ^ negative_bitset) { + if (string_key) { + ZVAL_STR_COPY(&zv, string_key); + } else { + ZVAL_LONG(&zv, num_key); + } + ZEND_HASH_FILL_ADD(&zv); } - } - i++; - } ZEND_HASH_FOREACH_END(); + i++; + } ZEND_HASH_FOREACH_END(); + } ZEND_HASH_FILL_END(); free_alloca(bitset, use_heap); } -- 2.40.0