Verification: a143cc29221c9be0

Php array сортировать по значению

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

Метод sort() сортирует массив по алфавиту:

Пример

var fruits = ["Banana", "Orange", "Apple", "Mango"];
fruits.sort();        // Сортирует элементы фруктов

Попробуйте сами »


Обращение массива

Метод reverse() изменяет элементы в массиве.

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

Пример

var fruits = ["Banana", "Orange", "Apple", "Mango"];
fruits.sort();        // Сначала сортируем элементы фруктов
fruits.reverse();     // Затем меняем порядок элементов

Попробуйте сами »


Числовая сортировка

По умолчанию sort() функция сортирует значения как строки.

Это хорошо работает для струнных ("Apple" стоит перед "Banana").

Однако, если числа сортируются как строки, "25" больше "100", потому что "2" больше "1".

Из-за этого sort() метод при сортировке чисел дает неверный результат.

Вы можете исправить это, предоставив функцию сравнения:

Пример

var points = [40, 100, 1, 5, 25, 10];
points.sort(function(a, b){return a - b});

Попробуйте сами »

Используйте тот же прием для сортировки массива по убыванию:

Пример

var points = [40, 100, 1, 5, 25, 10];
points.sort(function(a, b){return b - a});

Попробуйте сами »



Функция сравнения

Цель функции сравнения - определить альтернативный порядок сортировки.

Функция сравнения должна возвращать отрицательное, нулевое или положительное значение в зависимости от аргументов:

function(a, b){return a - b}

Когда sort() функция сравнивает два значения, она отправляет значения в функцию сравнения и сортирует значения в соответствии с возвращенным (отрицательным, нулевым, положительным) значением.

Если результат отрицательный a, сортировка производится раньше b.

Если результат положительный b, сортировка производится раньше a.

Если результат равен 0, то порядок сортировки двух значений не изменяется.

Пример:

Функция сравнения сравнивает все значения в массиве, по два значения за раз (a, b).

При сравнении 40 и 100 sort() метод вызывает функцию сравнения (40, 100).

Функция вычисляет от 40 до 100 (a - b), и поскольку результат отрицательный (-60), функция сортировки отсортирует 40 как значение ниже 100.

Вы можете использовать этот фрагмент кода, чтобы поэкспериментировать с числовой и алфавитной сортировкой:


function myFunction1() {
  points.sort();
  document.getElementById("demo").innerHTML = points;
}

function myFunction2() {
  points.sort(function(a, b){return a - b});
  document.getElementById("demo").innerHTML = points;
}

Попробуйте сами »


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

Пример

var points = [40, 100, 1, 5, 25, 10];
points.sort(function(a, b){return 0.5 - Math.random()});

Попробуйте сами »


Метод Фишера Йейтса

Приведенный выше пример array.sort() не является точным, некоторые числа будут предпочтительнее других.

Самый популярный правильный метод - перетасовка Фишера Йейтса - был введен в науку о данных еще в 1938 году!

В JavaScript этот метод можно перевести так:

Пример

var points = [40, 100, 1, 5, 25, 10];

for (i = points.length -1; i > 0; i--) {
  j = Math.floor(Math.random() * i)
  k = points[i]
  points[i] = points[j]
  points[j] = k
}

Попробуйте сами »


Найдите наибольшее (или наименьшее) значение массива

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

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

Сортировка по возрастанию:

Пример

var points = [40, 100, 1, 5, 25, 10];
points.sort(function(a, b){return a - b});
// теперь points[0] содержит наименьшее значение
// и points[points.length-1] содержит наибольшее значение

Попробуйте сами »

Сортировка по убыванию:

Пример

var points = [40, 100, 1, 5, 25, 10];
points.sort(function(a, b){return b - a});
// теперь points[0] содержит самое высокое значение
// и points[points.length-1] содержит самое низкое значение

Попробуйте сами »

Сортировка всего массива - очень неэффективный метод, если вы хотите найти только самое высокое (или самое низкое) значение.


Использование Math.max () в массиве

Вы можете использовать Math.max.apply для поиска наибольшего числа в массиве:

Пример

function myArrayMax(arr) {
  return Math.max.apply(null, arr);
}

Попробуйте сами »

Math.max.apply(null, [1, 2, 3]) эквивалентно Math.max(1, 2, 3).


Использование Math.min() в массиве

Вы можете использовать Math.min.apply для поиска наименьшего числа в массиве:

Пример

function myArrayMin(arr) {
  return Math.min.apply(null, arr);
}

Попробуйте сами »

Math.min.apply(null, [1, 2, 3]) эквивалентно Math.min(1, 2, 3).


Минимальные / максимальные методы JavaScript

Самое быстрое решение - использовать "самодельный" метод.

Эта функция просматривает массив, сравнивая каждое значение с наибольшим найденным значением:

Пример (Найти Max)

function myArrayMax(arr) {
  var len = arr.length;
  var max = -Infinity;
  while (len--) {
    if (arr[len] > max) {
      max = arr[len];
    }
  }
  return max;
}

Попробуйте сами »

Эта функция просматривает массив, сравнивая каждое значение с наименьшим найденным значением:

Пример (Найти Min)

function myArrayMin(arr) {
  var len = arr.length;
  var min = Infinity;
  while (len--) {
    if (arr[len]       min = arr[len];
    }
  }
  return min;
}

Попробуйте сами »


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

$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 - когда правый больше левого

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

// Сортируемый массив
$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)

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

sort($arr, SORT_STRING); 

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

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

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

// создадим функцию которая нам поможет в сортировке массивов
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'] 


Организация массива

Как писалось выше, массив состоит из элементов, каждый из которых имеет ключ и значение. Например массив содержащий информацию о ценах в ресторанном меню может выглядеть так:

Ключ Значение
breakfast 700
dinner 1500
supper 1100

Массив может иметь только один элемент с заданным ключом, т.е. в приведённом выше массиве не может быть двух элементов с ключом dinner. При попытке «добавить» второй dinner, мы просто перезапишем значение уже существующего элемента. В данном примере мы рассмотрели наиболее частый случай организации массива, а именно в виде ассоциативного. Ассоциативный массив удобнее использовать в коде, т.к. его ключи имеют осмысленные наименования (ассоциируются с какими-то частями приложения или данными которые обрабатывает скрипт). Но есть более простой пример массив, это числовые массивы. При их создании не нужно указывать ключ, он задаётся автоматически в виде целого числа, начиная с нуля.

Ключ Значение
0 700
1 1500
2 1100

Рассмотрим пример:


//Пример создания ассоциативного массива
$menuPrice = [
    'breakfast' => 700,
    'dinner' => 1500,
    'supper' => 1100
];

//Пример создания «числового» массива
$prices = [700, 1500, 1100];

В первом случае элементы массива представляют из себя пару ключ-значение, где в качестве ключа используются строковые названия «блюд» (приёмов пищи на самом деле, но пусть будет блюд), а значение это цена блюда. Во втором же случае я указал только цены, при этом интерпретатор PHP автоматически проставит ключи элементам массива.

Операции с массивами

Один из случаев ключевой операции с массивами, а именно его создание мы рассмотрели выше. А как ещё можно создать массив? Самый простой случай, это создание пустого массива:


//Создаём пустой массив
$array = [];

Создание и модификация массива

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

Вы так же можете заполнить массив на лету, например данными из базы данных:


//Заполняем массив данными из БД
$users = [];
//...некая выборка значения, например пользователей users
while($user = $db->query('SELECT * FROM users')->fetch(PDO::FETCH_ASSOC)){
    $users[] = $user;
}

Перебор массивов

С другой стороны готовый массив можно перебрать и например вывести его элементы на экран:


//Перебор массива
$week = ['Понедельник', 'Вторник', 'Среда', 'Четверг', 'Пятница', 'Суббота', 'Воскресенье'];

//Выведем список дней недели
echo '
    '; foreach ($week as $key => $day) { echo '
  • '. $day .'
  • '; } echo '
';

Вообще в php существует больше 70 функций для работы с массивами, однако в большинстве случаев вы будет использовать не больше двадцати. Приведу некоторые из них:

  • in_array — проверяет присутствие элемента в массиве
  • key_exists  — проверяет присутствует ли в массиве указанный ключ или индекс
  • array_search  — осуществляет поиск заданного значения в массиве и возвращает ключ первого найденного значения
  • array_merge — объединяет 2 и более массивов в один
  • array_chunk — разбивает массив на части

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

Отдельным блоком может идти операции связанные с сортировкой массив. В PHP существует несколько встроенных функций для быстрой сортировки массивов, например по возрастанию/убыванию значения или в алфавитном порядке. Причём сортировка может идти как по ключам массива так и по значениям. Одной из интересных возможностей предоставляет функция usort(), при помощи которой вы можете отсортировать элементы массива используя собственный алгоритм сравнения. Рассмотрим пример:


//Пользовательская функция сравнения элементов массива
function compare($a, $b)
{
    if ($a == $b) {
        return 0;
    }
    return ($a 

В результате выполнения данного примера получим такой массив:


array(5) {
  [0]=>int(1)
  [1]=>int(2)
  [2]=>int(3)
  [3]=>int(5)
  [4]=>int(6)
}

Как вы понимаете данный пример максимально упрощён. Но внутри вашей функции compare() можно реализовать любой алгоритм сравнения элементов. Главное правильно возвращать значение, ноль — если элементы не отличаются и их не надо менять местами и 1 или -1 если нужно изменить порядок элементов.

Вы так же можете пробросить в тело функции compare() внешнюю переменную используя анонимную функцию и ключевое слово use:


//Пользовательская функция сравнения элементов массива
$params = ['min_value'=>0, 'max_value'=>3];
function compare($params){
    return function ($a, $b) use ($params)
    {
        if ($a == $b) {
            return 0;
        }

        if($a = $params['min_value'] && $a 

Как видите теперь compare() принимает параметры $params и возвращает анонимную функцию в которой уже реализован ваш алгоритм сравнения в котором используются переданные параметры. Результат при таком алгоритме изменится:


array(5) {
  [0]=>int(1)
  [1]=>int(2)
  [2]=>int(3)
  [3]=>int(6)
  [4]=>int(5)
}

Грубо говоря сортировка по возрастанию шла пока значение $a попадало в диапазон от 0 до 3-х.

Глобальные массивы

В PHP начиная с версии 4 ввели такой сущность как «суперглобальные массивы». Это особые переменные доступные в любой части приложения и содержат информацию, например о состоянии сервера (массив $_SERVER) сессии, куках или переданных от пользователя запросах, одним словом о состоянии среды выполнения приложения. На данный момент в PHP доступно девять суперглобальных массивов:

Наименование Описание массива
$GLOBALS Этот массив содержим все переменные объявленные в скрипте, при этом имена переменных являются ключами этого массива.
$_SERVER Данный массив содержит всю информацию о сервере, а так же настройки среды в которой выполняется скрипт
$_GET Массив переменных переданных PHP скрипту по средствам GET запроса (через адресную строку браузера или другими методами, например curl())
$_POST Так же как и GET содержит переданные скрипту переменные, только уже методом POST
$_COOKIE Содержим coockies-ы пользователя
$_REQUEST Объединяет в себе массивы $GET, $POST и $COOKIE. Не рекомендуется использовать, не безопасно, хотя и удобно.
$_FILES Содержим список файлов загружаемых на сервер через веб-формы (имя, временный путь, размеры и т.д.)
$_ENV Содержит переменные окружения в котором запущен PHP скрипт
$_SESSION В данном массиве содержаться все переменные сессии текущего пользователя

 Чаще всего, вы будете сталкиваться с массивами $_GET и $_POST т.к. с их помощью в скрипты на сервере передаются данные от клиентской части (через веб-формы).