Php перемешать ассоциативный массив

shuffle

Функция перемешивает элементы массива в случайном порядке.

Функция не создаёт криптографически защищённые значения и не должна использоваться для криптографических целей или целей, требующих, чтобы возвращаемые значения были недоступны для разгадывания.

Если требуется криптографически безопасная случайная последовательность, Random\Randomizer может использоваться с движком Random\Engine\Secure . Для простых случаев использования функции random_int() и random_bytes() предоставляют удобный и безопасный API, поддерживаемый CSPRNG операционной системы.

Список параметров

Возвращаемые значения

Функция всегда возвращает true .

Список изменений

Версия Описание
7.1.0 Внутренний алгоритм получения случайных чисел изменён с функции rand библиотеки libc на генератор на базе » Вихря Мерсена.

Примеры

Пример #1 Пример использования shuffle()

$numbers = range ( 1 , 20 );
shuffle ( $numbers );
foreach ( $numbers as $number ) echo » $number » ;
>
?>

Примечания

Замечание: Эта функция присваивает новые ключи элементам array . Она удалит все существующие ключи, а не просто переупорядочит их.

Замечание:

Сбрасывает внутренний указатель массива на первый элемент.

Смотрите также

  • Random\Randomizer::shuffleArray() — Получает перестановку массива
  • Random\Randomizer::shuffleBytes() — Получает байтовую перестановку строки
  • Random\Randomizer::pickArrayKeys() — Выбирает случайные ключи массива
  • Сравнение функций сортировки массивов

User Contributed Notes 16 notes

shuffle for associative arrays, preserves key=>value pairs.
(Based on (Vladimir Kornea of typetango.com)’s function)

foreach( $keys as $key ) $new [ $key ] = $array [ $key ];
>

return true ;
>
?>

*note: as of PHP 5.2.10, array_rand’s resulting array of keys is no longer shuffled, so we use array_keys + shuffle.

Shuffle associative and non-associative array while preserving key, value pairs. Also returns the shuffled array instead of shuffling it in place.

function shuffle_assoc ( $list ) <
if (! is_array ( $list )) return $list ;

$keys = array_keys ( $list );
shuffle ( $keys );
$random = array();
foreach ( $keys as $key )
$random [ $key ] = $list [ $key ];

I needed a simple function two shuffle a two dimensional array. Please note the second level arrays must be indexed using integers, for example $myarray[0][«Name»] and not $myarray[«One»][«Name»]. Here is the function:

function twodshuffle ( $array )
// Get array length
$count = count ( $array );
// Create a range of indicies
$indi = range ( 0 , $count — 1 );
// Randomize indicies array
shuffle ( $indi );
// Initialize new array
$newarray = array( $count );
// Holds current index
$i = 0 ;
// Shuffle multidimensional array
foreach ( $indi as $index )
$newarray [ $i ] = $array [ $index ];
$i ++;
>
return $newarray ;
>
?>

Please note it only works on two dimensional arrays. Here is an example:

$myarray = array( «Google» => array( «Name» => «Google» , «URL» => «www.google.com» , «Usage» => «Googling» ), «Yahoo» => array( «Name» => «Yahoo» , «URL» => «www.yahoo.com» , «Usage» => «Yahooing?» ), «Ask» => array( «Name» => «Ask» , «URL» => «www.ask.com» , «Usage» => «Asking Jeeves» ));

print_r ( twodshuffle ( $myarray ));

/* And the result is:
Array ( [0] => Array ( [Name] => Ask [URL] => www.ask.com [Usage] => Asking Jeeves ) [1] => Array ( [Name] => Google [URL] => www.google.com [Usage] => Googling ) [2] => Array ( [Name] => Yahoo [URL] => www.yahoo.com [Usage] => Yahooing? ) )
*/
?>

Hope you find it useful!

There is an function which uses native shuffle() but preserves keys, and their order, so at end, only values are shuffled.

/**
* Array Quake — Give an array good quake so every value will endup with random given space.
* Keys, and their order are preserved.
* @author xZero
* @param array $array
* @return boolean false on failure
*/
function array_quake (& $array ) if ( is_array ( $array )) $keys = array_keys ( $array ); // We need this to preserve keys
$temp = $array ;
$array = NULL ;
shuffle ( $temp ); // Array shuffle
foreach ( $temp as $k => $item ) $array [ $keys [ $k ]] = $item ;
>
return;
>
return false ;
>

// Example
$numbers = array(
‘ZERO’ => 0 ,
‘ONE’ => 1 ,
‘TWO’ => 2 ,
‘THREE’ => 3 ,
‘FOUR’ => 4 ,
‘FIVE’ => 5 ,
‘SIX’ => 6 ,
‘SEVEN’ => 7 ,
‘EIGHT’ => 8 ,
‘NINE’ => 9
);
echo «\nBefore (original):\n» ;
print_r ( $numbers );
array_quake ( $numbers );
echo «\n\nAfter (Array Quake);\n» ;
print_r ( $numbers );
echo «\n» ;
?>

Result example:
Before (original):
Array
(
[ZERO] => 0
[ONE] => 1
[TWO] => 2
[THREE] => 3
[FOUR] => 4
[FIVE] => 5
[SIX] => 6
[SEVEN] => 7
[EIGHT] => 8
[NINE] => 9
)

After (Array Quake);
Array
(
[ZERO] => 4
[ONE] => 2
[TWO] => 0
[THREE] => 8
[FOUR] => 3
[FIVE] => 6
[SIX] => 1
[SEVEN] => 7
[EIGHT] => 5
[NINE] => 9
)

If you want the Power Set (set of all unique subsets) of an array instead of permutations, you can use this simple algorithm:

/**
* Returns the power set of a one dimensional array,
* a 2-D array.
* array(a,b,c) ->
* array(array(a),array(b),array(c),array(a,b),array(b,c),array(a,b,c))
*/
function powerSet ( $in , $minLength = 1 ) <
$count = count ( $in );
$members = pow ( 2 , $count );
$return = array();
for ( $i = 0 ; $i < $members ; $i ++) <
$b = sprintf ( «%0» . $count . «b» , $i );
$out = array();
for ( $j = 0 ; $j < $count ; $j ++) <
if ( $b < $j >== ‘1’ ) $out [] = $in [ $j ];
>
if ( count ( $out ) >= $minLength ) <
$return [] = $out ;
>
>
return $return ;
>
?>

Building on examples by m227 and pineappleclock, here is a function that returns all permutations of each set in the power set of an array of strings (instead of a string). Thanks for the great examples!

Example:
$in = array(«A»,»B»,»C»);
$power_perms = power_perms($in);

function power_perms ( $arr )

$power_set = power_set ( $arr );
$result = array();
foreach( $power_set as $set ) $perms = perms ( $set );
$result = array_merge ( $result , $perms );
>
return $result ;
>

function power_set ( $in , $minLength = 1 )

$count = count ( $in );
$members = pow ( 2 , $count );
$return = array();
for ( $i = 0 ; $i < $members ; $i ++) $b = sprintf ( "%0" . $count . "b" , $i );
$out = array();
for ( $j = 0 ; $j < $count ; $j ++) if ( $b < $j >== ‘1’ ) $out [] = $in [ $j ];
>
if ( count ( $out ) >= $minLength ) $return [] = $out ;
>
>

//usort($return,»cmp»); //can sort here by length
return $return ;
>

function factorial ( $int ) if( $int < 2 ) return 1 ;
>

for( $f = 2 ; $int — 1 > 1 ; $f *= $int —);

function perm ( $arr , $nth = null )

if ( $nth === null ) return perms ( $arr );
>

$result = array();
$length = count ( $arr );

while ( $length —) $f = factorial ( $length );
$p = floor ( $nth / $f );
$result [] = $arr [ $p ];
array_delete_by_key ( $arr , $p );
$nth -= $p * $f ;
>

$result = array_merge ( $result , $arr );
return $result ;
>

function perms ( $arr ) $p = array();
for ( $i = 0 ; $i < factorial ( count ( $arr )); $i ++) $p [] = perm ( $arr , $i );
>
return $p ;
>

function array_delete_by_key (& $array , $delete_key , $use_old_keys = FALSE )

if(! $use_old_keys ) $array = array_values ( $array );
>

Источник

Переворачиваем и перемешиваем массив в php

Сегодня мы рассмотрим две функции, применяемые к массивам в php. При помощи одной функции мы сможем перевернуть массив, то есть первый его элемент станет последним, а последний первым и т.д. При помощи второй функции мы перемешаем значения массива так, чтобы они расположились в случайном порядке.

Эти действия вполне могут Вам пригодиться при решении различных задач программирования, так что давайте познакомимся с данными функциями.

Работать с ними совершенно не сложно, так что данный пост будет достаточно коротким. Однако, есть и некоторые нюансы, который нужно будет учесть.

Ну что ж, давайте начнем с переворачивания массива.

Переворачивание массива в php

Чтобы перевернуть массив, познакомимся с функцией array_reverse(). После применения данной функции к определенному массиву, мы получим массив, элементы которого будут следовать в обратном порядке относительно исходного массива.

А протестировать работу данной функции достаточно просто: нам следует объявить массив, применить к нему данную функцию, после чего можно вывести результат на экран, чтобы убедиться, что элементы расположились в обратном порядке.

Результат, как мы можем видеть из скриншота, именно тот, которого мы и ожидали: последний элемент стал первым, предпоследний – вторым и т.д.

Мы проделали переворачивание с массивом-списком. А как же насчет ассоциативных массивов? Ведь в них значения элемента привязано к ключу!

И ассоциативные массивы можно спокойно переворачивать, при этом их связь с ключом не потеряется.

Давайте рассмотрим это на простом примере.

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

Перемешивание массива в php

Также мы можем перемешать элементы массива случайным образом. Для этого существует специальная функция shuffle().

Ее применение достаточно простое. Однако, здесь нужно запомнить один небольшой нюанс: если Вы будете применять функцию к ассоциативному массиву, то в результате получите данный массив в виде списка. То есть значения элементов массива будут перемешаны, но связь ключ-значение уже не сохранится. Результатом будет массив-список.

Давайте рассмотрим на примерах.

Для начала я перемешаю значения элементов обычного массива-списка:

А вот и результат! Как Вы видите, значения элементов массива расположились в случайном порядке. Причем, если Вы будете обновлять страницу, то результат будет меняться.

Теперь давайте тоже самое проделаем с ассоциативным массивом:

Значение элементов массива также перемешалось случайным образом, но здесь мы уже не можем наблюдать связи ключ-значение. Массив возвращен, как список.

Вот об этом нюансе перемешивания, пожалуйста, не забывайте.

И это все, о чем я хотела рассказать Вам в этом небольшом посте. Надеюсь информация была Вам полезной, и, если Вы работаете с массивами php, то рано или поздно она Вам пригодится.

Добавляйте страничку в закладки, чтобы можно было всегда к ней вернуться и еще раз посмотреть, как работать с массивами. Также читайте другие посты, посвященные массивам php… и не только. Ссылки Вы можете видеть ниже.

Жду Ваших комментариев! Делитесь постом с друзьями при помощи социальных кнопок, которые расположены ниже, а также подписывайтесь на обновления, чтобы всегда быть в курсе новых статей и уроков.

С Вами была Анна Котельникова.

Успехов Вам и до скорых встреч в следующих публикациях!

Источник

php, как перемешать / рандомизировать порядок ассоциативного массива, сохраняя пары ключ / значение

что является функцией php для случайного распределения ассоциативного массива при сохранении пар ключ / значения. Я не хочу просто случайным образом выбирать пару ключевых значений, но фактически изменять массив (аналогично функции uasort, но не в порядке).

original array ( [a] => 4 [b] => 8 [c] => -1 [d] => -9 [e] => 2 [f] => 5 [g] => 3 [h] => -4 ) random ordered array ( [d] => -9 [a] => 4 [b] => 8 [c] => -1 [h] => -4 [e] => 2 [g] => 3 [h] => -4 [f] => 5 ) 

Изменить Сравнение между двумя решениями.

$start = microtime(true); $array = array('a' => 4, 'b' => 8, 'c' => -1, 'd' => -9, 'e' => 2, 'f' => 5, 'g' => 3, 'h' => -4); $shuffleKeys = array_keys($array); shuffle($shuffleKeys); $newArray = array(); foreach($shuffleKeys as $key) < $newArray[$key] = $array[$key]; >print_r ($newArray); $elapsed = microtime(true) - $start; echo "
array values took $elapsed seconds.
"; $start = microtime(true); $array = array('a' => 4, 'b' => 8, 'c' => -1, 'd' => -9, 'e' => 2, 'f' => 5, 'g' => 3, 'h' => -4); $keys = array_keys( $array ); shuffle( $keys ); print_r(array_merge( array_flip( $keys ) , $array )); $elapsed = microtime(true) - $start; echo "
array values took $elapsed seconds.
";

Массив ([h] => -4 [e] => 2 [b] => 8 [d] => -9 [a] => 4 [c] => -1 [f] => 5 [g] => 3) значения массива взяли 3.0994415283203E-5 секунд.

Массив ([e] => 2 [a] => 4 [d] => -9 [c] => -1 [g] => 3 [f] => 5 [b] => 8 [h] = > -4) принимали значения 4.2915344238281E-5 секунд.

Вы можете использовать shuffle () для array_keys, а затем объедините свой массив, добавив их в список в новом порядке.

$shuffleKeys = array_keys($array); shuffle($shuffleKeys); $newArray = array(); foreach($shuffleKeys as $key)

Источник

Читайте также:  Javascript проверка полей формы html
Оцените статью