I think it would be better to either use a correct algorithm or not to
add this function at all. I think it's a reasonable expectation on a
user's part to assume that foo_shuffle() actually does a proper
shuffle. We got all sorts of complaints about the array shuffling code
being broken.

-adam

On Wed, 25 Sep 2002, Andrey Hristov wrote:

> andrey                Wed Sep 25 14:06:06 2002 EDT
> 
>   Modified files:              
>     /php4/ext/standard        basic_functions.c php_string.h string.c 
>   Log:
>   str_shuffle() function added. Like shuffle() for arrays - however the
>   algorithm for creating the permutation is quite simple. More like 
>   the implementation of shuffle() for 4.2.1 .
>   
>   
> Index: php4/ext/standard/basic_functions.c
> diff -u php4/ext/standard/basic_functions.c:1.511 
>php4/ext/standard/basic_functions.c:1.512
> --- php4/ext/standard/basic_functions.c:1.511 Wed Sep 25 11:25:11 2002
> +++ php4/ext/standard/basic_functions.c       Wed Sep 25 14:06:05 2002
> @@ -17,7 +17,7 @@
>     +----------------------------------------------------------------------+
>   */
>  
> -/* $Id: basic_functions.c,v 1.511 2002/09/25 15:25:11 wez Exp $ */
> +/* $Id: basic_functions.c,v 1.512 2002/09/25 18:06:05 andrey Exp $ */
>  
>  #include "php.h"
>  #include "php_streams.h"
> @@ -329,6 +329,7 @@
>       PHP_FE(strstr,                                                                 
>                                                 NULL)
>       PHP_FE(stristr,                                                                
>                                                 NULL)
>       PHP_FE(strrchr,                                                                
>                                                 NULL)
> +     PHP_FE(str_shuffle,                                                            
>                                                         NULL)
>  
>  #ifdef HAVE_STRCOLL
>       PHP_FE(strcoll,                                                                
>                                                 NULL)
> Index: php4/ext/standard/php_string.h
> diff -u php4/ext/standard/php_string.h:1.60 php4/ext/standard/php_string.h:1.61
> --- php4/ext/standard/php_string.h:1.60       Tue Aug 20 16:47:47 2002
> +++ php4/ext/standard/php_string.h    Wed Sep 25 14:06:05 2002
> @@ -17,7 +17,7 @@
>     +----------------------------------------------------------------------+
>  */
>  
> -/* $Id: php_string.h,v 1.60 2002/08/20 20:47:47 wez Exp $ */
> +/* $Id: php_string.h,v 1.61 2002/09/25 18:06:05 andrey Exp $ */
>  
>  /* Synced with php 3.0 revision 1.43 1999-06-16 [ssb] */
>  
> @@ -82,6 +82,7 @@
>  PHP_FUNCTION(substr_count);
>  PHP_FUNCTION(str_pad);
>  PHP_FUNCTION(sscanf);
> +PHP_FUNCTION(str_shuffle);
>  #ifdef HAVE_STRCOLL
>  PHP_FUNCTION(strcoll);
>  #endif
> Index: php4/ext/standard/string.c
> diff -u php4/ext/standard/string.c:1.297 php4/ext/standard/string.c:1.298
> --- php4/ext/standard/string.c:1.297  Mon Sep 23 10:20:02 2002
> +++ php4/ext/standard/string.c        Wed Sep 25 14:06:05 2002
> @@ -18,7 +18,7 @@
>     +----------------------------------------------------------------------+
>   */
>  
> -/* $Id: string.c,v 1.297 2002/09/23 14:20:02 sebastian Exp $ */
> +/* $Id: string.c,v 1.298 2002/09/25 18:06:05 andrey Exp $ */
>  
>  /* Synced with php 3.0 revision 1.193 1999-06-16 [ssb] */
>  
> @@ -3929,6 +3929,39 @@
>       zval_copy_ctor(return_value);
>  
>       php_strtr(Z_STRVAL_P(return_value), Z_STRLEN_P(return_value), rot13_from, 
>rot13_to, 52);
> +}
> +/* }}} */
> +
> +
> +static int php_string_shuffle(const void *a, const void *b TSRMLS_DC)
> +{
> +     long rnd;
> +     rnd = php_rand(TSRMLS_C);
> +     if (rnd % 3)
> +             return 1;
> +     else if (rnd % 5)
> +             return 0;
> +     else 
> +             return -1;
> +}
> +
> +/* {{{ proto string str_shuffle(string str)
> +   Shuffles string. One permutation of all possible is created */
> +PHP_FUNCTION(str_shuffle)
> +{
> +     /* Note : by using current php_string_shuffle for string  */
> +     /* with 6 chars (6! permutations) about 2/3 of them are   */
> +     /* computed for 6! calls for the function. So it isn't so */
> +     /* unique. The ratio is the same for other lengths.       */
> +     char *str;
> +     int i, str_len;
> +     
> +     i = 0;
> +     if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &str, &str_len) == 
>FAILURE) {
> +             RETURN_FALSE;
> +     }
> +     zend_qsort((void *)str, str_len, sizeof(char), php_string_shuffle TSRMLS_CC);
> +     RETURN_STRINGL(str, str_len, 1);
>  }
>  /* }}} */
>  
> 
> 
> 
> 


-- 
PHP CVS Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to