diff options
author | Nikita Popov <nikita.ppv@gmail.com> | 2020-04-29 10:35:44 +0200 |
---|---|---|
committer | Nikita Popov <nikita.ppv@gmail.com> | 2020-05-11 14:16:24 +0200 |
commit | 091d53c1310c78a47edcc7eaef5b7b005b3856ab (patch) | |
tree | 1bb7abe2830962f2bd67b92fa5ea440c3fe7b9ae /ext/standard/array.c | |
parent | b111674383fb638830193da672908a3abd5afe4e (diff) | |
download | php-git-091d53c1310c78a47edcc7eaef5b7b005b3856ab.tar.gz |
Use standard key behavior in array_column()
array_column() reimplements array key handling in a way that does
not match standard array key behavior in PHP. Avoid this by making
use of the standard API.
Of course, there is a minor backwards compatibilty break here,
e.g. people could be relying on objects getting cast to string
instead of throwing.
Closes GH-5487.
Diffstat (limited to 'ext/standard/array.c')
-rw-r--r-- | ext/standard/array.c | 41 |
1 files changed, 2 insertions, 39 deletions
diff --git a/ext/standard/array.c b/ext/standard/array.c index 3e54946cd0..fd0ceaa600 100644 --- a/ext/standard/array.c +++ b/ext/standard/array.c @@ -4174,48 +4174,11 @@ PHP_FUNCTION(array_column) continue; } - /* Failure will leave keyval alone which will land us on the final else block below - * which is to append the value as next_index - */ zval rv; zval *keyval = array_column_fetch_prop(data, index_str, index_long, &rv); - if (keyval) { - switch (Z_TYPE_P(keyval)) { - case IS_STRING: - zend_symtable_update(Z_ARRVAL_P(return_value), Z_STR_P(keyval), colval); - break; - case IS_LONG: - zend_hash_index_update(Z_ARRVAL_P(return_value), Z_LVAL_P(keyval), colval); - break; - case IS_OBJECT: - { - zend_string *tmp_key; - zend_string *key = zval_get_tmp_string(keyval, &tmp_key); - zend_symtable_update(Z_ARRVAL_P(return_value), key, colval); - zend_tmp_string_release(tmp_key); - break; - } - case IS_NULL: - zend_hash_update(Z_ARRVAL_P(return_value), ZSTR_EMPTY_ALLOC(), colval); - break; - case IS_DOUBLE: - zend_hash_index_update(Z_ARRVAL_P(return_value), - zend_dval_to_lval(Z_DVAL_P(keyval)), colval); - break; - case IS_TRUE: - zend_hash_index_update(Z_ARRVAL_P(return_value), 1, colval); - break; - case IS_FALSE: - zend_hash_index_update(Z_ARRVAL_P(return_value), 0, colval); - break; - case IS_RESOURCE: - zend_hash_index_update(Z_ARRVAL_P(return_value), Z_RES_HANDLE_P(keyval), colval); - break; - default: - zend_hash_next_index_insert(Z_ARRVAL_P(return_value), colval); - break; - } + array_set_zval_key(Z_ARRVAL_P(return_value), keyval, colval); + zval_ptr_dtor(colval); zval_ptr_dtor(keyval); } else { zend_hash_next_index_insert(Z_ARRVAL_P(return_value), colval); |