Commit: d8a5f41a606a19efea7fe4df34bb24e66d3d3762 Author: Xinchen Hui <larue...@php.net> Mon, 1 Apr 2013 19:11:45 +0800 Parents: 3b504a371734cec343a5b17adc019b54f474b2a9 Branches: PHP-5.5
Link: http://git.php.net/?p=php-src.git;a=commitdiff;h=d8a5f41a606a19efea7fe4df34bb24e66d3d3762 Log: Fixed bug parameter is casted to string of array_column Changed paths: M ext/standard/array.c A ext/standard/tests/array/array_column_object_cast.phpt Diff: diff --git a/ext/standard/array.c b/ext/standard/array.c index 226bfef..9a64cf4 100644 --- a/ext/standard/array.c +++ b/ext/standard/array.c @@ -2529,32 +2529,32 @@ PHP_FUNCTION(array_count_values) value_key and optionally indexed by the index_key */ PHP_FUNCTION(array_column) { - zval *zarray, *zcolumn, *zkey = NULL, **data, **zcolval, **zkeyval; + zval *zarray, **zcolumn, **zkey = NULL, **data, **zcolval, **zkeyval; HashTable *arr_hash; 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; - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "az|z", &zarray, &zcolumn, &zkey) == FAILURE) { + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "aZ|Z", &zarray, &zcolumn, &zkey) == FAILURE) { return; } - switch (Z_TYPE_P(zcolumn)) { + switch (Z_TYPE_PP(zcolumn)) { case IS_NULL: column_idx = 0; break; case IS_LONG: - column_idx = Z_LVAL_P(zcolumn); + column_idx = Z_LVAL_PP(zcolumn); break; case IS_STRING: - column = Z_STRVAL_P(zcolumn); - column_len = Z_STRLEN_P(zcolumn); + column = Z_STRVAL_PP(zcolumn); + column_len = Z_STRLEN_PP(zcolumn); break; case IS_OBJECT: - convert_to_string(zcolumn); - column = Z_STRVAL_P(zcolumn); - column_len = Z_STRLEN_P(zcolumn); + convert_to_string_ex(zcolumn); + column = Z_STRVAL_PP(zcolumn); + column_len = Z_STRLEN_PP(zcolumn); break; default: php_error_docref(NULL TSRMLS_CC, E_WARNING, "The column key should be either a string or an integer"); @@ -2562,21 +2562,21 @@ PHP_FUNCTION(array_column) } if (zkey) { - switch (Z_TYPE_P(zkey)) { + switch (Z_TYPE_PP(zkey)) { case IS_NULL: key_idx = 0; break; case IS_LONG: - key_idx = Z_LVAL_P(zkey); + key_idx = Z_LVAL_PP(zkey); break; case IS_STRING: - key = Z_STRVAL_P(zkey); - key_len = Z_STRLEN_P(zkey); + key = Z_STRVAL_PP(zkey); + key_len = Z_STRLEN_PP(zkey); break; case IS_OBJECT: - convert_to_string(zkey); - key = Z_STRVAL_P(zkey); - key_len = Z_STRLEN_P(zkey); + convert_to_string_ex(zkey); + key = Z_STRVAL_PP(zkey); + key_len = Z_STRLEN_PP(zkey); break; default: php_error_docref(NULL TSRMLS_CC, E_WARNING, "The index key should be either a string or an integer"); @@ -2592,6 +2592,8 @@ PHP_FUNCTION(array_column) zend_hash_move_forward_ex(arr_hash, &pointer)) { if (Z_TYPE_PP(data) == IS_ARRAY) { + zval *strkey = NULL; + if (column && zend_hash_find(Z_ARRVAL_PP(data), column, column_len + 1, (void**)&zcolval) == FAILURE) { continue; } else if (!column && zend_hash_index_find(Z_ARRVAL_PP(data), column_idx, (void**)&zcolval) == FAILURE) { @@ -2617,8 +2619,12 @@ PHP_FUNCTION(array_column) keyval = Z_STRVAL_PP(zkeyval); break; case IS_OBJECT: - convert_to_string(*zkeyval); - keyval = Z_STRVAL_PP(zkeyval); + { + MAKE_STD_ZVAL(strkey); + MAKE_COPY_ZVAL(zkeyval, strkey); + convert_to_string(strkey); + keyval = Z_STRVAL_P(strkey); + } break; default: keyval_idx = -1; @@ -2628,6 +2634,9 @@ PHP_FUNCTION(array_column) if (keyval) { add_assoc_zval(return_value, keyval, *zcolval); + if (strkey) { + zval_ptr_dtor(&strkey); + } } else if (keyval_idx != -1) { add_index_zval(return_value, keyval_idx, *zcolval); } else { diff --git a/ext/standard/tests/array/array_column_object_cast.phpt b/ext/standard/tests/array/array_column_object_cast.phpt new file mode 100644 index 0000000..762aaa8 --- /dev/null +++ b/ext/standard/tests/array/array_column_object_cast.phpt @@ -0,0 +1,52 @@ +--TEST-- +Test array_column() function: basic functionality +--FILE-- +<?php +class ColumnKeyClass { + function __toString() { return 'first_name'; } +} + +class IndexKeyClass { + function __toString() { return 'id'; } +} + +class ValueClass { + function __toString() { return '2135'; } +} + + +$column_key = new ColumnKeyClass(); +$index_key = new IndexKeyClass(); +$value = new ValueClass(); + + +// Array representing a possible record set returned from a database +$records = array( + array( + 'id' => $value, + 'first_name' => 'John', + 'last_name' => 'XXX' + ), + array( + 'id' => 3245, + 'first_name' => 'Sally', + 'last_name' => 'Smith' + ), +); +$firstNames = array_column($records, $column_key, $index_key); +print_r($firstNames); +var_dump($column_key); +var_dump($index_key); +var_dump($value); +--EXPECTF-- +Array +( + [2135] => John + [3245] => Sally +) +object(ColumnKeyClass)#%d (0) { +} +object(IndexKeyClass)#%d (0) { +} +object(ValueClass)#%d (0) { +} -- PHP CVS Mailing List (http://www.php.net/) To unsubscribe, visit: http://www.php.net/unsub.php