andrei Fri Jul 14 22:15:54 2006 UTC Modified files: /php-src unicode-progress.txt /php-src/ext/standard array.c Log: - Simplify array_combine() and adjust for params API - Adjust array_count_values() and array_rand() for params API and mark with U
http://cvs.php.net/viewvc.cgi/php-src/unicode-progress.txt?r1=1.22&r2=1.23&diff_format=u Index: php-src/unicode-progress.txt diff -u php-src/unicode-progress.txt:1.22 php-src/unicode-progress.txt:1.23 --- php-src/unicode-progress.txt:1.22 Fri Jul 14 21:16:30 2006 +++ php-src/unicode-progress.txt Fri Jul 14 22:15:54 2006 @@ -10,12 +10,6 @@ Need to fix string_compare_function() to compare Unicode strings directly in code point order - array_combine() - Handle IS_UNICODE/IS_STRING keys via add_u_assoc_zval() - - array_count_values() - Params API, minor Unicode updates, test - array_diff(), array_udiff() array_diff_assoc(), array_diff_uassoc(), array_udiff_assoc(), array_udiff_uassoc() array_diff_key(), array_diff_ukey() @@ -40,9 +34,6 @@ array_pad() Params API, test - array_rand() - Params API, test - array_reduce() Params API, FCI cache, test @@ -76,6 +67,8 @@ ------- array_change_key_case() array_chunk() + array_combine() + array_count_values() array_fill() array_flip() array_key_exists() @@ -84,6 +77,7 @@ array_merge_recursive() array_product() array_push(), array_pop(), array_shift(), array_unshift() + array_rand() array_search() array_slice() array_splice() http://cvs.php.net/viewvc.cgi/php-src/ext/standard/array.c?r1=1.360&r2=1.361&diff_format=u Index: php-src/ext/standard/array.c diff -u php-src/ext/standard/array.c:1.360 php-src/ext/standard/array.c:1.361 --- php-src/ext/standard/array.c:1.360 Fri Jul 14 21:16:30 2006 +++ php-src/ext/standard/array.c Fri Jul 14 22:15:54 2006 @@ -21,7 +21,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: array.c,v 1.360 2006/07/14 21:16:30 andrei Exp $ */ +/* $Id: array.c,v 1.361 2006/07/14 22:15:54 andrei Exp $ */ #include "php.h" #include "php_ini.h" @@ -2549,23 +2549,17 @@ /* }}} */ -/* {{{ proto array array_count_values(array input) +/* {{{ proto array array_count_values(array input) U Return the value as key and the frequency of that value in input as value */ PHP_FUNCTION(array_count_values) { - zval **input, /* Input array */ - **entry, /* An entry in the input array */ - **tmp; + zval *input, /* Input array */ + **entry, /* An entry in the input array */ + **tmp; HashTable *myht; HashPosition pos; - /* Get arguments and do error-checking */ - if (ZEND_NUM_ARGS() != 1 || zend_get_parameters_ex(1, &input) == FAILURE) { - WRONG_PARAM_COUNT; - } - - if (Z_TYPE_PP(input) != IS_ARRAY) { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "The argument should be an array"); + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "a", &input) == FAILURE) { return; } @@ -2573,7 +2567,7 @@ array_init(return_value); /* Go through input array and add values to the return array */ - myht = Z_ARRVAL_PP(input); + myht = Z_ARRVAL_P(input); zend_hash_internal_pointer_reset_ex(myht, &pos); while (zend_hash_get_current_data_ex(myht, (void **)&entry, &pos) == SUCCESS) { if (Z_TYPE_PP(entry) == IS_LONG) { @@ -3933,52 +3927,43 @@ /* }}} */ -/* {{{ proto mixed array_rand(array input [, int num_req]) +/* {{{ proto mixed array_rand(array input [, int num_req]) U Return key/keys for random entry/entries in the array */ PHP_FUNCTION(array_rand) { - zval **input, **num_req; - long randval; - int num_req_val, num_avail, key_type; + zval *input; + long randval, num_req = 1; + int num_avail, key_type; zstr string_key; uint string_key_len; ulong num_key; HashPosition pos; - if (ZEND_NUM_ARGS() < 1 || ZEND_NUM_ARGS() > 2 || - zend_get_parameters_ex(ZEND_NUM_ARGS(), &input, &num_req) == FAILURE) { - WRONG_PARAM_COUNT; - } - - if (Z_TYPE_PP(input) != IS_ARRAY) { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "First argument has to be an array"); + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "a|l", &input, &num_req) == FAILURE) { return; } - num_avail = zend_hash_num_elements(Z_ARRVAL_PP(input)); + num_avail = zend_hash_num_elements(Z_ARRVAL_P(input)); if (ZEND_NUM_ARGS() > 1) { - convert_to_long_ex(num_req); - num_req_val = Z_LVAL_PP(num_req); - if (num_req_val <= 0 || num_req_val > num_avail) { + if (num_req <= 0 || num_req > num_avail) { php_error_docref(NULL TSRMLS_CC, E_WARNING, "Second argument has to be between 1 and the number of elements in the array"); return; } - } else - num_req_val = 1; + } /* Make the return value an array only if we need to pass back more than one result. */ - if (num_req_val > 1) { + if (num_req > 1) { array_init(return_value); } /* We can't use zend_hash_index_find() because the array may have string keys or gaps. */ - zend_hash_internal_pointer_reset_ex(Z_ARRVAL_PP(input), &pos); - while (num_req_val && (key_type = zend_hash_get_current_key_ex(Z_ARRVAL_PP(input), &string_key, &string_key_len, &num_key, 0, &pos)) != HASH_KEY_NON_EXISTANT) { + zend_hash_internal_pointer_reset_ex(Z_ARRVAL_P(input), &pos); + while (num_req && (key_type = zend_hash_get_current_key_ex(Z_ARRVAL_P(input), &string_key, &string_key_len, &num_key, 0, &pos)) != HASH_KEY_NON_EXISTANT) { randval = php_rand(TSRMLS_C); - if ((double)(randval/(PHP_RAND_MAX+1.0)) < (double)num_req_val/(double)num_avail) { + if ((double)(randval/(PHP_RAND_MAX+1.0)) < (double)num_req/(double)num_avail) { /* If we are returning a single result, just do it. */ if (Z_TYPE_P(return_value) != IS_ARRAY) { if (key_type == HASH_KEY_IS_STRING) { @@ -3997,13 +3982,13 @@ else add_next_index_long(return_value, num_key); } - num_req_val--; + num_req--; } num_avail--; - zend_hash_move_forward_ex(Z_ARRVAL_PP(input), &pos); + zend_hash_move_forward_ex(Z_ARRVAL_P(input), &pos); } - if (num_req_val == num_avail) { + if (num_req == num_avail) { array_data_shuffle(return_value TSRMLS_CC); } } @@ -4577,24 +4562,28 @@ } /* }}} */ -/* {{{ proto array array_combine(array keys, array values) - Creates an array by using the elements of the first parameter as keys and the elements of the second as correspoding keys */ +/* {{{ proto array array_combine(array keys, array values) U + Creates an array by using the elements of the first parameter as keys and the elements of the second as the correspoding values */ PHP_FUNCTION(array_combine) { zval *values, *keys; HashPosition pos_values, pos_keys; zval **entry_keys, **entry_values; + int num_keys, num_values; if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "aa", &keys, &values) == FAILURE) { return; } - if (zend_hash_num_elements(Z_ARRVAL_P(keys)) != zend_hash_num_elements(Z_ARRVAL_P(values))) { + num_keys = zend_hash_num_elements(Z_ARRVAL_P(keys)); + num_values = zend_hash_num_elements(Z_ARRVAL_P(values)); + + if (num_keys != num_values) { php_error_docref(NULL TSRMLS_CC, E_WARNING, "Both parameters should have equal number of elements"); RETURN_FALSE; } - if (!zend_hash_num_elements(Z_ARRVAL_P(keys))) { + if (!num_keys) { php_error_docref(NULL TSRMLS_CC, E_WARNING, "Both parameters should have at least 1 element"); RETURN_FALSE; } @@ -4605,24 +4594,30 @@ zend_hash_internal_pointer_reset_ex(Z_ARRVAL_P(values), &pos_values); while (zend_hash_get_current_data_ex(Z_ARRVAL_P(keys), (void **)&entry_keys, &pos_keys) == SUCCESS && zend_hash_get_current_data_ex(Z_ARRVAL_P(values), (void **)&entry_values, &pos_values) == SUCCESS) { - if (Z_TYPE_PP(entry_keys) == IS_STRING) { - zval_add_ref(entry_values); - add_assoc_zval(return_value, Z_STRVAL_PP(entry_keys), *entry_values); - } else if (Z_TYPE_PP(entry_keys) == IS_LONG) { + + if (Z_TYPE_PP(entry_keys) == IS_LONG) { zval_add_ref(entry_values); add_index_zval(return_value, Z_LVAL_PP(entry_keys), *entry_values); } else { - zval key; + zval key, *key_ptr = *entry_keys; + + if (Z_TYPE_PP(entry_keys) != IS_STRING && + Z_TYPE_PP(entry_keys) != IS_UNICODE) { - key = **entry_keys; - zval_copy_ctor(&key); - convert_to_string(&key); + key = **entry_keys; + zval_copy_ctor(&key); + convert_to_text(&key); + key_ptr = &key; + } zval_add_ref(entry_values); - add_assoc_zval(return_value, Z_STRVAL(key), *entry_values); + add_u_assoc_zval(return_value, Z_TYPE_P(key_ptr), Z_UNIVAL_P(key_ptr), *entry_values); - zval_dtor(&key); + if (key_ptr != *entry_keys) { + zval_dtor(&key); + } } + zend_hash_move_forward_ex(Z_ARRVAL_P(keys), &pos_keys); zend_hash_move_forward_ex(Z_ARRVAL_P(values), &pos_values); }
-- PHP CVS Mailing List (http://www.php.net/) To unsubscribe, visit: http://www.php.net/unsub.php