Случайная сортировка массива php

Случайная сортировка массива php

Рассмотрим некоторые встроенные наиболее распространенные функции, которые мы можем применять при работе с массивами.

Функция is_array

Функция is_array() проверяет, является ли переменная массивом, и если является, то возвращает true , иначе возвращает false . Например:

$users = ["Tom", "Bob", "Sam"]; $isArray = is_array($users); echo ($isArray==true)?"это массив":"это не массив";

Функции count/sizeof

Функция count() и sizeof() получают количество элементов массива:

$users = ["Tom", "Bob", "Sam"]; $number = count($users); // то же самое, что // $number = sizeof($users); echo "В массиве users $number элемента/ов";

Функции shuffle

Функция shuffle перемешивает элементы массивы случайным образом:

$users = ["Tom", "Bob", "Sam", "Alice"]; shuffle($users); print_r($users); // один из возможных вариантов //Array ( [0] => Bob [1] => Tom [2] => Alice [3] => Sam )

Функции compact

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

 Apple II [producer] => Apple [year] => 1978 ) ?>

Функция compact получает в скобках набор переменных. Каждая переменная указывается в кавычка без знака $. Результатом функции является новый массив.

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

В PHP имеются два типа сортировки: сортировка строк по алфавиту и сортировка чисел по возрастанию/убыванию. Если сортируемые значения представляют строки, то они сортируются по алфавиту, если числа — то они сортируются в порядке возрастания чисел. PHP по умолчанию самостоятельно выбирает тип сортировки.

Для сортировки по возрастанию используется функция asort :

$users = ["Tom", "Bob", "Sam", "Alice"]; asort($users); print_r($users); // вывод отсортированного массива // Array ( [3] => Alice [1] => Bob [2] => Sam [0] => Tom )

В данном случае значения массива представляют строки, поэтому PHP выберет сортировку по алфавиту. Однако с помощью дополнительного параметра мы можем явно указать интерпретатору PHP тип сортировки. Данный параметр может принимать три значения:

  • SORT_REGULAR : автоматический выбор сортировки
  • SORT_NUMERIC : числовая сортировка
  • SORT_STRING : сортировка по алфавиту

Укажем явно тип сортировки:

Чтобы отсортировать массив в обратном порядке, применяется функция arsort :

Сортировка по ключам

Функция asort производит сортировку по значениям элементов, но также существует и еще и сортировка по ключам. Она представлена функцией ksort :

$states = ["Spain" => "Madrid", "France" => "Paris", "Germany" => "Berlin", ]; asort($states); print_r($states); // массив после asort - сортировка по значениям элементов // Array ( [Germany] => Berlin [Spain] => Madrid [France] => Paris ) ksort($states); print_r($states); // массив после ksort - сортировка по ключам элементов // Array ( [France] => Paris [Germany] => Berlin [Spain] => Madrid )

Сортировка по ключам в обратном порядке выполняется функцией krsort() :

Естественная сортировка

Хотя выше описанные функции сортировки прекрасно выполняют свою работу, но их возможностей все-таки недостаточно. Например, отсортируем по возрастанию следующий массив:

 Windows 10 [0] => Windows 7 [1] => Windows 8 ) ?>

Так как значения представляют строки, то PHP сортирует по алфавиту. Однако подобная сортировка не учитывает числа и регистр. Поэтому значение «Windows 10» будет идти в самом начале, а не в конце, как должно было быть. И для решения этой проблемы в PHP есть функция natsort() , которая выполняет естественную сортировку:

 Windows 7 [1] => Windows 8 [2] => Windows 10) ?>

Если нам надо еще при этом, чтобы сортировка не учитывала регистр, то мы можем применить функцию natcasesort() :

Источник

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 есть встроенная функция shuffle() , которая принимает на вход массив и перемешивает его в случайном порядке. Массив передаётся в функцию по ссылке. Давайте посмотрим на пример. Попробуем дважды перемешать один и тот же массив.

 $collection = ['hexlet', 1, 69, 'awesomeness']; shuffle($collection); print_r($collection); //=> [1, 'hexlet', 'awesomeness', 69] shuffle($collection); print_r($collection); //=> [69, 'awesomeness', 1, 'hexlet'] 

Тут видно, что изменяется сам изначальный массив.

Источник

Читайте также:  Java lang string getproperty
Оцените статью