- shuffle
- Список параметров
- Возвращаемые значения
- Список изменений
- Примеры
- Примечания
- Смотрите также
- User Contributed Notes 16 notes
- Переворачиваем и перемешиваем массив в php
- Переворачивание массива в php
- Перемешивание массива в php
- 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 » ;
>
?>?php
Примечания
Замечание: Эта функция присваивает новые ключи элементам 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)