ID: 7045 Updated by: lobbin Reported By: [EMAIL PROTECTED] Status: Open Bug Type: Arrays related Operating System: Linux RH 6 and 7 PHP Version: 4.1.0 Assigned To: rodif_bl New Comment:
Can someone check/commit this? :) Previous Comments: ------------------------------------------------------------------------ [2002-01-12 20:45:00] [EMAIL PROTECTED] here is a patch that fixes the shuffle and adds ashuffle. Im pretty new to this list and if someone could tell me if i can/should apply this to cvs? --- ext/standard/array.c.old Sat Jan 12 04:23:55 2002 +++ ext/standard/array.c Sat Jan 12 10:03:17 2002 @@ -1415,13 +1415,72 @@ } /* }}} */ - -static int array_data_shuffle(const void *a, const void *b TSRMLS_DC) +static int php_rand_sort(void *base, size_t nmemb, size_t size, int (*cmp)(const void *, const void *)) { - return (php_rand(TSRMLS_C) % 2) ? 1 : -1; + Bucket *t, **new_order; + HashTable *ht; + int i, j; + ulong num_key; + char *string_key; + + int status, *tmp; + + new_order = emalloc(sizeof(Bucket *) * nmemb); + + ALLOC_HASHTABLE(ht); + zend_hash_init(ht, 0, NULL, ZVAL_PTR_DTOR, 0); + + for(i = 0;i < nmemb;i++) + { + zval *z_rand; + MAKE_STD_ZVAL(z_rand); + ZVAL_LONG(z_rand,rand()); + + t = *(((Bucket **)base) + i); + if(t->nKeyLength == 0) + status = zend_hash_index_update(ht, t->h, &z_rand, sizeof(zval *), NULL); + else + status = zend_hash_update(ht, t->arKey, t->nKeyLength, &z_rand, sizeof(zval *), NULL); + } + + set_compare_func(SORT_NUMERIC TSRMLS_CC); + zend_hash_sort(ht, qsort, array_data_compare, 0); + + zend_hash_internal_pointer_reset(ht); + for(i = 0;i < nmemb;i++) + { + switch(zend_hash_get_current_key(ht, &string_key, &num_key, 1)) + { + case HASH_KEY_IS_STRING: + for(j = 0;j < nmemb;j++) + { + t = *(((Bucket **)base) + j); + if(!strncmp(t->arKey,string_key,t->nKeyLength)) + { + new_order[i] = *(((Bucket **)base) + j); + break; + } + } + break; + case HASH_KEY_IS_LONG: + for(j = 0;j < nmemb;j++) + { + t = *(((Bucket **)base) + j); + if(t->h == num_key) + { + new_order[i] = *(((Bucket **)base) + j); + break; + } + } + break; + } + zend_hash_move_forward(ht); + } + memcpy(base, new_order, size * nmemb); + zend_hash_destroy(ht); + efree(new_order); } - /* {{{ proto bool shuffle(array array_arg) Randomly shuffle the contents of an array */ PHP_FUNCTION(shuffle) @@ -1431,7 +1490,23 @@ if (zend_parse_parameters(1 TSRMLS_CC, "a", &array) == FAILURE) { RETURN_FALSE; } - if (zend_hash_sort(Z_ARRVAL_PP(&array), (sort_func_t)php_mergesort, array_data_shuffle, 1 TSRMLS_CC) == FAILURE) { + if (zend_hash_sort(Z_ARRVAL_PP(&array), (sort_func_t)php_rand_sort, NULL, 1 TSRMLS_CC) == FAILURE) { + RETURN_FALSE; + } + RETURN_TRUE; +} +/* }}} */ + +/* {{{ proto bool ashuffle(array array_arg) + Randomly shuffle the contents of an array keeping keys intact*/ +PHP_FUNCTION(ashuffle) +{ + zval *array; + + if (zend_parse_parameters(1 TSRMLS_CC, "a", &array) == FAILURE) { + RETURN_FALSE; + } + if (zend_hash_sort(Z_ARRVAL_PP(&array), (sort_func_t)php_rand_sort, NULL, 0 TSRMLS_CC) == FAILURE) { RETURN_FALSE; } RETURN_TRUE; @@ -2880,7 +2955,7 @@ } if (num_req_val == num_avail) { - if (zend_hash_sort(Z_ARRVAL_P(return_value), (sort_func_t)php_mergesort, array_data_shuffle, 1 TSRMLS_CC) == FAILURE) { + if (zend_hash_sort(Z_ARRVAL_P(return_value), (sort_func_t)php_rand_sort, NULL, 1 TSRMLS_CC) == FAILURE) { zval_dtor(return_value); RETURN_FALSE; } --- ext/standard/php_array.h.old Sat Jan 12 10:11:26 2002 +++ ext/standard/php_array.h Sat Jan 12 10:11:40 2002 @@ -55,6 +55,7 @@ PHP_FUNCTION(array_fill); PHP_FUNCTION(range); PHP_FUNCTION(shuffle); +PHP_FUNCTION(ashuffle); PHP_FUNCTION(array_multisort); PHP_FUNCTION(array_push); PHP_FUNCTION(array_pop); --- ext/standard/basic_functions.c.old Sat Jan 12 10:10:36 2002 +++ ext/standard/basic_functions.c Sat Jan 12 10:10:54 2002 @@ -748,6 +748,7 @@ PHP_FE(uasort, first_arg_force_ref) PHP_FE(uksort, first_arg_force_ref) PHP_FE(shuffle, first_arg_force_ref) + PHP_FE(ashuffle, first_arg_force_ref) PHP_FE(array_walk, first_arg_force_ref) PHP_FE(count, NULL) PHP_FE(end, first_arg_force_ref) ------------------------------------------------------------------------ [2001-12-13 23:17:46] [EMAIL PROTECTED] updated php version and short summary. ------------------------------------------------------------------------ [2001-12-13 16:21:02] [EMAIL PROTECTED] Still behaves the same on PHP 4.1.0/Linux ------------------------------------------------------------------------ [2001-10-15 09:00:00] [EMAIL PROTECTED] Any news on this? Derick ------------------------------------------------------------------------ [2000-10-30 10:07:36] [EMAIL PROTECTED] This is probably the property of sort algorithm used in shuffle. Whoever wrote it, please take attention! ------------------------------------------------------------------------ The remainder of the comments for this report are too long. To view the rest of the comments, please view the bug report online at http://bugs.php.net/?id=7045 Edit this bug report at http://bugs.php.net/?id=7045&edit=1 -- PHP Development Mailing List <http://www.php.net/> To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED] To contact the list administrators, e-mail: [EMAIL PROTECTED]