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