Re: Predictable-random array

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Dotan Cohen wrote:
I've got an array $items which has about 200 entires. I want to print

it might be helpful to know where the array comes from.
or maybe its a static definition to start with (nothing wrong with that as such :-)
does $items change over time? in what way?

them out in random order, but as usual, I have a catch! I need to add
a 'key' so that if need be, I can always return to the same 'random'
order, like so:

$items=predicatable_random($items, "qwerty");

the problem is persistence, if you want a random order that doesn't change
then you have to create the random order, and then store an index for it
somewhere. it may be feasable to either serialize the result and read it from disk
when needed, or store a list of keys (an index of sorts) in file/db and
use that to perform an ordering as required.


so for each place that I need the items rearranged, I will replace
qwerty with a different string, and get a different 'random' order. I
haven't played around with it much as I stumbled into a brick wall
fairly early and can't get much going. Any ideas?

I tried to play with usort, uksort, ksort, and various combinations
with shuffle. The 'randomization' can be based on qualities of each
string, such as 'sort alphebetically by the 7th character', so I

thats not random. maybe the 'key' you need to pass is
a callback function whose job it is to produce a replicable
(or random for that matter!) ordering somehow - depending on the
complexity of the calculation and size of the dataset you may
need to cache (look at http://php.net/mt_srand if you need predictable
[psuedo]randomness without cacheing (using 'fixed' seeds), and check
the usernotes on http://php.net/shuffle also). e.g:

$items = array(
    /*     |--char 7     */
    "cherries",
    "bananas",
    "orangejuice",
    "red apples",
    "smelly fish",
    "more bananas",
    "ship full of bananas",
    "tarantula",
    "poisoned apple",
    /*     |--char 7     */
);

function permaRandom($items, $callback)
{
    /* caching left as an exercise to the reader ;-/ */
    if (is_callable($callback)) {
        $items2 = /*($yes = gotcachedpermarandom($callback))
            ? getfromcache($callback)
            : */call_user_func($callback, $items);
        /* if ($yes) storeincache($callback, $items2); */
    }

    return $items2;
}

function sortAlphaChar7Random($items)
{
    $keys = $items2 = array();
    // assumption made that $item is a string
    // and at least 7 chars long, oh and spaces
    // wont do much good for the sorting probably..
    foreach ($items as $k => $item) {
        $keys[$k] = @$item{7};
    }
    asort($keys, SORT_LOCALE_STRING | SORT_STRING);
    foreach ($keys as $k => $v) {
        $items2[] = $items[$k];
    }
    return $items2;
}

var_dump(permaRandom($items, "sortAlphaChar7Random"),
	 permaRandom($items, "sortAlphaChar7Random"),
	 permaRandom($items, "sortAlphaChar7Random"));

thought that I'd try that, but I got lost in explodes and such.

Thanks all. I always look forward to my php lessons!

Dotan
http://english-lyrics.com/el/index.php
Song Lyrics


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


[Index of Archives]     [PHP Home]     [Apache Users]     [PHP on Windows]     [Kernel Newbies]     [PHP Install]     [PHP Classes]     [Pear]     [Postgresql]     [Postgresql PHP]     [PHP on Windows]     [PHP Database Programming]     [PHP SOAP]

  Powered by Linux