diff --git a/ext/standard/array.c b/ext/standard/array.c index 9a64cf4e052a1..1048894d0b622 100644 --- a/ext/standard/array.c +++ b/ext/standard/array.c @@ -2534,7 +2534,8 @@ PHP_FUNCTION(array_column) HashPosition pointer; ulong column_idx = 0, key_idx = 0; char *column = NULL, *key = NULL, *keyval = NULL; - int column_len = 0, key_len = 0, keyval_idx = -1; + zend_bool use_keyval = 0; + int column_len = 0, key_len = 0, keyval_len = 0, keyval_idx; if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "aZ|Z", &zarray, &zcolumn, &zkey) == FAILURE) { return; @@ -2602,21 +2603,19 @@ PHP_FUNCTION(array_column) Z_ADDREF_PP(zcolval); + use_keyval = 0; keyval = NULL; - keyval_idx = -1; - if (zkey) { - if (key && zend_hash_find(Z_ARRVAL_PP(data), key, key_len + 1, (void**)&zkeyval) == FAILURE) { - keyval_idx = -1; - } else if (!key && zend_hash_index_find(Z_ARRVAL_PP(data), key_idx, (void**)&zkeyval) == FAILURE) { - keyval_idx = -1; - } else { - switch (Z_TYPE_PP(zkeyval)) { + if (zkey && ((key && zend_hash_find(Z_ARRVAL_PP(data), key, key_len + 1, (void**)&zkeyval) != FAILURE) || + (!key && zend_hash_index_find(Z_ARRVAL_PP(data), key_idx, (void**)&zkeyval) != FAILURE))) { + use_keyval = 1; + switch (Z_TYPE_PP(zkeyval)) { case IS_LONG: keyval_idx = Z_LVAL_PP(zkeyval); break; case IS_STRING: keyval = Z_STRVAL_PP(zkeyval); + keyval_len = Z_STRLEN_PP(zkeyval); break; case IS_OBJECT: { @@ -2624,26 +2623,29 @@ PHP_FUNCTION(array_column) MAKE_COPY_ZVAL(zkeyval, strkey); convert_to_string(strkey); keyval = Z_STRVAL_P(strkey); + keyval_len = Z_STRLEN_P(strkey); } break; default: - keyval_idx = -1; - } + use_keyval = 0; } } - - if (keyval) { - add_assoc_zval(return_value, keyval, *zcolval); - if (strkey) { - zval_ptr_dtor(&strkey); + + if (use_keyval) { + if (keyval) { + add_assoc_zval_ex(return_value, keyval, keyval_len+1, *zcolval); + if (strkey) { + zval_ptr_dtor(&strkey); + } + } + else { + add_index_zval(return_value, keyval_idx, *zcolval); } - } else if (keyval_idx != -1) { - add_index_zval(return_value, keyval_idx, *zcolval); } else { add_next_index_zval(return_value, *zcolval); } } - + } } /* }}} */ diff --git a/ext/standard/tests/array/array_column_minus_one_index.phpt b/ext/standard/tests/array/array_column_minus_one_index.phpt new file mode 100644 index 0000000000000..d8a97b6b65dea --- /dev/null +++ b/ext/standard/tests/array/array_column_minus_one_index.phpt @@ -0,0 +1,33 @@ +--TEST-- +Test array_column() function: basic functionality (saving of -1 index) +--FILE-- + 2135, + 'first_name' => 'John', + 'last_name' => 'Doe' + ), + array( + 'id' => -1, + 'first_name' => 'Sally', + 'last_name' => 'Smith' + ), + array( + 'id' => -2, + 'first_name' => 'Jane', + 'last_name' => 'Jones' + ), +); + +$firstNames = array_column($records, 'first_name', 'id'); +print_r($firstNames); +?> +--EXPECTF-- +Array +( + [2135] => John + [-1] => Sally + [-2] => Jane +) +