diff options
author | Xinchen Hui <laruence@gmail.com> | 2016-08-03 12:06:04 +0800 |
---|---|---|
committer | Xinchen Hui <laruence@gmail.com> | 2016-08-03 12:06:04 +0800 |
commit | be00b4ed13819b464f77c6dc6f72734f34e5bcc6 (patch) | |
tree | b62d9dede128495299b9903f538a4fb3bacc9ab2 | |
parent | 501d24f81bc94343e90fc8d0003aed45ebce52b9 (diff) | |
download | php-git-be00b4ed13819b464f77c6dc6f72734f34e5bcc6.tar.gz |
Optmized array_rand
-rw-r--r-- | ext/standard/array.c | 28 |
1 files 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); } |