Php random sort an array

Сортировка массивов в php: ksort, asort и прочие sort’ы

Более подробную информацию и примеры вы всегда можете найти в документации по функциям сортировки.

Допустим у нас есть массив

$arr = [ 2 => 'Виноград', 1 => 'Арбуз', 3 => 'Банан', ];

Он неправильно отсортирован, как видите ключи (1,2,3) и значения (виноград, арбуз, банан) идут не по порядку. Давайте это исправим:

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

ksort($arr); // По возрастанию krsort($arr); // По убыванию

Сортировка массива по значению

sort($arr);// По возрастанию asort($arr);// По возрастанию, сохраняет ключи rsort($arr); // По убыванию arsort($arr); // По убыванию, сохраняет ключи array_reverse($arr); // От конца к началу array_reverse($arr, true); // От конца к началу, сохраняет ключи shuffle($arr); // Перемешать массив в случайном порядке

Свои способы сортировки

Если предложенные способы сортировки вам не подходят, то можно создать свой способ сортировки ключей и значений массивов. Для этого есть 3 функции uasort, uksort и usort. С их помощью мы можем задать свою callback функцию, которая будет сравнивать элементы между собой и определять какой из них «больше» и какой «меньше».

  • uasort — Сортирует массив, используя пользовательскую функцию для сравнения элементов с сохранением ключей
  • uksort — Сортирует массив по ключам, используя пользовательскую функцию для сравнения ключей
  • usort — Сортирует массив по значениям используя пользовательскую функцию для сравнения элементов

Принцип работы следующий, мы создаем callback функцию сравнения по какому-то необычному признаку. Она должна сравнивать элементы и возвращать одно из трех значений: -1, 0 или 1

Давайте рассмотрим как они работают напримере функции uasort, которая сравнивает значения с сохранением ключей.

// Наша функция сравнения $callbackCmpFunction = function cmp($a, $b) < if ($a == $b) < // если 2 значения массива равны return 0; // вернем 0 >return ($a

  • -1 — возвращается, когда элемент, который слева больше правого
  • 0 — когда элементы равны
  • 1 — когда правый больше левого
Читайте также:  Php regexp все символы

Применить нашу новую функцию можно так:

// Сортируемый массив $array = array('a' => 4, 'b' => 8, 'c' => -1, 'd' => -9, 'e' => 2, 'f' => 5, 'g' => 3, 'h' => -4); print_r($array); // Сортируем и выводим получившийся массив uasort($array, $callbackCmpFunction); // вторым параметром указываем нашу callback функцию print_r($array);

Сохранение ключей означает, что каждый ключ как бы привязан к своему значению.

Функции без сохранения ключей sort и rsort, сбрасывают ключи и они начинают идти по порядку (0, 1, 2, . )

Иногда бывает полезно одно, иногда — другое. В зависимости от задачи.

Если сортировка не дает ожидаемый результат, то изучите флаги сортировки. По умолчанию используется обычный тип сортировки SORT_REGULAR

  • SORT_REGULAR — обычное сравнение элементов; подробности описаны в разделе операторы сравнения
  • SORT_NUMERIC — числовое сравнение элементов
  • SORT_STRING — строковое сравнение элементов
  • SORT_LOCALE_STRING — сравнение элементов как строки на основе текущего языкового стандарта. Используется языковой стандарт, который можно изменить с помощью setlocale()
  • SORT_NATURAL — сравнение элементов как строки, используя «естественный порядок», например natsort()
  • SORT_FLAG_CASE — можно объединять (побитовое ИЛИ) с SORT_STRING или SORT_NATURAL для сортировки строк без учёта регистра. Пример: sort($arr, SORT_NATURAL | SORT_FLAG_CASE)

Флаг сортировки передается в функцию сортировки, например так:

Сортировка многомерных массивов

Создадим функцию, которая нам поможет в сортировке массивов

// создадим функцию которая нам поможет в сортировке массивов function array_orderby() < $args = func_get_args(); $data = array_shift($args); foreach ($args as $n =>$field) < if (is_string($field)) < $tmp = array(); foreach ($data as $key =>$row) $tmp[$key] = $row[$field]; $args[$n] = $tmp; > > $args[] = &$data; call_user_func_array('array_multisort', $args); return array_pop($args); >

Пример работы этой функции array_orderby() :

$data = [ ['volume' => 67, 'edition' => 2], ['volume' => 86, 'edition' => 1], ['volume' => 85, 'edition' => 6], ['volume' => 98, 'edition' => 2], ['volume' => 86, 'edition' => 6], ['volume' => 67, 'edition' => 7], ]; // Сортируем массив $data сначала по volume, затем по edition $sorted = array_orderby($data, 'volume', SORT_DESC, 'edition', SORT_ASC); // SORT_ASC - по возрастанию // SORT_DESC - по убыванию print_r($sorted); // выводим результат

Если вам нужно что-то совсем уж специфическое при сортировки многомерных массивов

Можете создать и другие callback функции сортировки самостоятельно.

$data = [ ['volume' => 67, 'edition' => 2], ['volume' => 86, 'edition' => 1], ['volume' => 85, 'edition' => 6], ['volume' => 98, 'edition' => 2], ['volume' => 86, 'edition' => 6], ['volume' => 67, 'edition' => 7], ]; // Создадим 2 функции function cmp_function($a, $b) < // volume по возрастанию return ($a['volume'] >$b['volume']); > function cmp_function_desc($a, $b) < // volume по убыванию return ($a['volume'] < $b['volume']); >uasort($array, 'cmp_function'); // сортируем по возрастанию, по полю count uasort($array, 'cmp_function_desc'); // сортируем по убыванию, по полю count

Массивы на «стероидах»

Часто работаете с массивами? Тогда вам понравится это расширение для работы с коллекциями.

Читайте также:  Html alt что это

Рассмотрим несколько примеров.

$collection = collect([5, 3, 1, 2, 4]); $sorted = $collection->sort(); $sorted->values()->all(); // [1, 2, 3, 4, 5]

Сортировка по одной «колонке» ассоциативного массива:

$collection = collect([ ['name' => 'Desk', 'price' => 200], ['name' => 'Chair', 'price' => 100], ['name' => 'Bookcase', 'price' => 150], ]); $sorted = $collection->sortBy('price'); $sorted->values()->all(); /* [ ['name' => 'Chair', 'price' => 100], ['name' => 'Bookcase', 'price' => 150], ['name' => 'Desk', 'price' => 200], ] */

Сортировка по нескольким аттрибутам одновременно:

$collection = collect([ ['name' => 'Taylor Otwell', 'age' => 34], ['name' => 'Abigail Otwell', 'age' => 30], ['name' => 'Taylor Otwell', 'age' => 36], ['name' => 'Abigail Otwell', 'age' => 32], ]); $sorted = $collection->sortBy([ ['name', 'asc'], ['age', 'desc'], ]); $sorted->values()->all(); /* [ ['name' => 'Abigail Otwell', 'age' => 32], ['name' => 'Abigail Otwell', 'age' => 30], ['name' => 'Taylor Otwell', 'age' => 36], ['name' => 'Taylor Otwell', 'age' => 34], ] */

Вы также можете использовать свои функции сортировки при работе с коллекциями:

$collection = collect([ ['name' => 'Taylor Otwell', 'age' => 34], ['name' => 'Abigail Otwell', 'age' => 30], ['name' => 'Taylor Otwell', 'age' => 36], ['name' => 'Abigail Otwell', 'age' => 32], ]); $sorted = $collection->sortBy([ fn ($a, $b) => $a['name'] $b['name'], fn ($a, $b) => $b['age'] $a['age'], ]); $sorted->values()->all(); /* [ ['name' => 'Abigail Otwell', 'age' => 32], ['name' => 'Abigail Otwell', 'age' => 30], ['name' => 'Taylor Otwell', 'age' => 36], ['name' => 'Taylor Otwell', 'age' => 34], ] */

Коллекции позволяют работать с массивами как в Laravel и функции этого замечательного инструмента далеко не ограничиваются сортировкой.

Изучите документацию и вы влюбитесь в коллекции.

Читайте также:  Javascript onclick function this value

Если у вас есть вопросы или вы нашли ошибку — пишите в комментариях.

Источник

Элементы массива в случайном порядке (PHP)

Отсортировать элементы массива в случайном порядке можно при помощи функции void shuffle(array &$array) . Функция принимает массив по ссылке и сортирует массив в случайном порядке, при это сбрасывая ключи массива.

Пример

‘; print_r($array); // сортируем в случайном порядке shuffle($array); print_r($array); echo ‘‘; ?>

Результат

В результате на экране вы увидите 2 массива, первый исходный, второй отсортированный.

Array ( [0] => 1 [1] => 2 [2] => 3 [3] => 4 [4] => 5 [5] => 6 [6] => 7 [7] => 8 [8] => 9 [9] => 10 ) Array ( [0] => 4 [1] => 5 [2] => 7 [3] => 1 [4] => 8 [5] => 2 [6] => 10 [7] => 6 [8] => 3 [9] => 9 )

Категории

Читайте также

  • Удалить пустые элементы из массива (PHP)
  • Цикл в обратном порядке (PHP)
  • Случайный элемент массива (JavaScript)
  • Получить последнее значение массива (PHP)
  • Умножить массив на число (PHP)
  • Получить первое значение массива (PHP)
  • Сортировка пузырьком (PHP)
  • Поменять местами 2 элемента массива (PHP)
  • Найти и удалить элемент массива (PHP)
  • Получить последовательность элементов массива (PHP)
  • Как объединить два массива (PHP)
  • Количество элементов ассоциативного массива (JavaScript)

Комментарии

Вход на сайт

Введите данные указанные при регистрации:

Социальные сети

Вы можете быстро войти через социальные сети:

Источник

Как перемешать 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'] 

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

Источник

Оцените статью