summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorXinchen Hui <laruence@gmail.com>2016-08-03 12:06:04 +0800
committerXinchen Hui <laruence@gmail.com>2016-08-03 12:06:04 +0800
commitbe00b4ed13819b464f77c6dc6f72734f34e5bcc6 (patch)
treeb62d9dede128495299b9903f538a4fb3bacc9ab2
parent501d24f81bc94343e90fc8d0003aed45ebce52b9 (diff)
downloadphp-git-be00b4ed13819b464f77c6dc6f72734f34e5bcc6.tar.gz
Optmized array_rand
-rw-r--r--ext/standard/array.c28
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);
}