Архив June, 2010

Псевдослучайное перемешивание массива

Иногда надо перемешать массив с предсказуемыми результатами. То есть порядок элементов на выходе зависит от одного параметра, а не каждый раз случаен.

Пример:

PHP:
  1. $a = array(
  2.     'jam' => 'good #1',
  3.     'banana' => 'good #2',
  4.     'meat' => 'good #3',
  5.     'whats' => 'not good',
  6. );
  7.  
  8. echo '<pre>';
  9. echo 'shuffleTest - test'."\n";
  10. print_r(shuffleArrayCrc32($a, 'test'));
  11. echo 'shuffleTest - test'."\n";
  12. print_r(shuffleArrayCrc32($a, 'test'));
  13. echo 'shuffleTest - 1234'."\n";
  14. print_r(shuffleArrayCrc32($a, '1234'));
  15. echo 'shuffleTest - 1234'."\n";
  16. print_r(shuffleArrayCrc32($a, '1234'));

Первый и второй результат должны быть одинаковыми; третий и четвёртый - тоже.

Результат:

shuffleTest - test
Array
(
    [jam] => good #1
    [meat] => good #3
    [banana] => good #2
    [whats] => not good
)
shuffleTest - test
Array
(
    [jam] => good #1
    [meat] => good #3
    [banana] => good #2
    [whats] => not good
)
shuffleTest - test2
Array
(
    [whats] => not good
    [banana] => good #2
    [meat] => good #3
    [jam] => good #1
)
shuffleTest - test2
Array
(
    [whats] => not good
    [banana] => good #2
    [meat] => good #3
    [jam] => good #1
)

А вот и сама функция:

PHP:
  1. function shuffleArrayCrc32($a, $s) {
  2.     $hash = abs(crc32($s));
  3.        
  4.     $result = array();
  5.     while (!empty($a)) {
  6.         $keys = array_keys($a);
  7.         $key = $keys[$hash % count($keys)];
  8.         $result[$key] = $a[$key];
  9.         unset($a[$key]);
  10.     }
  11.        
  12.     return $result;
  13. }

Нет комментариев