diff options
-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); } |