Массивы очень удобны для обработки большого количества информации. Существует большое количество функций для удобной работы с ними. В частности, сегодня речь пойдёт о сортировке. Ничего нового открывать я не буду, просто познакомлю с самыми нужными для ежедневного кодинга.
Сортирование индексированных массивов: sort() and rsort()
Функция sort() сортирует значения в индексированном массиве в возрастающем порядке. Это означает, что A идёт перед Z, 0 -перед 9. Заглавные буквы перед строчными, буквы перед цифрами. Например:
$myArray = array(1, 2, "a", "b", "A", "B"); sort($myArray); // Отображает "A B a b 1 2" foreach ($myArray as $val) echo "$val ";
rsort() - это sort() наоборот:
$myArray = array(1, 2, "a", "b", "A", "B"); rsort($myArray); // Отображает "2 1 b a B A" foreach ($myArray as $val) echo "$val ";
Все sorting-функции возвращают true при успехе, и false при обломе)
Сортировка ассоциативных массивов: asort() and arsort()
sort() и rsort() очень хороши для индексированных массивов, где не нужно волноваться о связи ключа и значения. Могут получится неожиданности) Например:
$movie = array("title" => "Rear Window", "director" => "Alfred Hitchcock", "year" => 1954, "minutes" => 112); sort($movie); // Отобразит "Array ( => Alfred Hitchcock => Rear Window => 112 => 1954)" print_r($movie);
Видно, что произошла путаница, и оригинальная структура «title», «director», «year» and «minutes» поменялась.
Если же вы хотите сортировать ассоциативный массив по первичному ключу, используйте функции asort() и arsort() Эти функции учитывают связь ключей и их значений
За возрастающий порядок сортировки отвечает функция asort():
$movie = array("title" => "Rear Window", "director" => "Alfred Hitchcock", "year" => 1954, "minutes" => 112); asort($movie); // Отображает "Array ( => Alfred Hitchcock => Rear Window => 112 => 1954)" print_r($movie);
arsort() наоборот:
$movie = array("title" => "Rear Window", "director" => "Alfred Hitchcock", "year" => 1954, "minutes" => 112); arsort($movie); // Отображает "Array ( => 1954 => 112 => Rear Window => Alfred Hitchcock)" print_r($movie);
Сортировка ассоциативных массивов по ключу: ksort() и krsort()
ksort() сортирует по возрастанию значения ключа, krsort() - по убыванию. Как и asort() с arsort(), эта функция сохраняет связь между ключом значением. Пример:
$movie = array("title" => "Rear Window", "director" => "Alfred Hitchcock", "year" => 1954, "minutes" => 112); // Отображает "Array ( => Alfred Hitchcock => 112 => Rear Window => 1954)" ksort($movie); print_r($movie); // Отображает "Array ( => 1954 => Rear Window => 112 => Alfred Hitchcock)" krsort($movie); print_r($movie);
Сортировка сложных и многомерных массивов с array_multisort()
Очень мощная функция array_multisort() может сортировать многомерный массив, сохраняя связь между массивами.
Вобщем, сейчас всё увидим:
Сортировка сложных массивов
Сортируем, используя array_multisort(), просто указываем те массивы, которые нужно обратотать:
$directors = array("Stanley Kubrick", "Alfred Hitchcock", "Martin Scorsese"); $titles = array("Full Metal Jacket", "Rear Window", "Mean Streets"); $years = array(1987, 1954, 1973); array_multisort($directors, $titles, $years); print_r($directors); echo "
"; print_r($titles); echo "
"; print_r($years); echo "
";
Этот код отобразит:
Array ( => Alfred Hitchcock => Martin Scorsese => Stanley Kubrick)
Array ( => Rear Window => Mean Streets => Full Metal Jacket)
Array ( => 1954 => 1973 => 1987)
Сначала array_multisort() сортирует значения в $directors в возрастающем порядке, затем 2 остальных так же.
А что если мы хотим сортировать, например, чтобы вначале «title»? Просто положите $titles вперёд списка:
Array_multisort($titles, $directors, $years);
Если первый массив содержит какое-то количество id-номеров, тогда array_multisort() сортирует
по этим значениям первый массив, затем - второй, и тд. Пример:
$directors = array("Stanley Kubrick", "Alfred Hitchcock", "Martin Scorsese", "Stanley Kubrick"); $titles = array("Full Metal Jacket", "Rear Window", "Mean Streets", "A Clockwork Orange"); $years = array(1987, 1954, 1973, 1971); array_multisort($directors, $titles, $years); print_r($directors); echo "
"; print_r($titles); echo "
"; print_r($years); echo "
";
Этот код выдаёт следующее - заметьте, что «A Clockwork Orange» перед «Full Metal Jacket»:
Array ( => Alfred Hitchcock => Martin Scorsese => Stanley Kubrick => Stanley Kubrick)
Array ( => Rear Window => Mean Streets => A Clockwork Orange => Full Metal Jacket)
Array ( => 1954 => 1973 => 1971 => 1987)
Меняем порядок сортировки
Вы можете пропустить (опционально) flag-аргумент после аргумента массива чтобы менять порядок сортировки:
SORT_ASC
сортировка по возрастанию
SORT_DESC
сортировка по убыванию
Тут сортируем $directors по возрастанию, затем $titles по убыванию:
$directors = array("Stanley Kubrick", "Alfred Hitchcock", "Martin Scorsese", "Stanley Kubrick"); $titles = array("Full Metal Jacket", "Rear Window", "Mean Streets", "A Clockwork Orange"); $years = array(1987, 1954, 1973, 1971); array_multisort($directors, SORT_ASC, $titles, SORT_DESC, $years); print_r($directors); echo "
"; print_r($titles); echo "
"; print_r($years); echo "
";
Вот что вышло: заметьте, что «Full Metal Jacket» теперь перед «A Clockwork Orange»:
Array ( => Alfred Hitchcock => Martin Scorsese => Stanley Kubrick => Stanley Kubrick)
Array ( => Rear Window => Mean Streets => Full Metal Jacket => A Clockwork Orange)
Array ( => 1954 => 1973 => 1987 => 1971)
Сортировка многомерных массивов
Сортировка через array_multisort() проходит по первому элементу каждого массива. Если 2 значения одинаковы, сортирвка идёт по 2у элементу и тп.
Это пример, который показывает, как это работает
Сортировка идет по director, потом по title, потом по year:
$movies = array(array("director" => "Alfred Hitchcock", "title" => "Rear Window", "year" => 1954), array("director" => "Stanley Kubrick", "title" => "Full Metal Jacket", "year" => 1987), array("director" => "Martin Scorsese", "title" => "Mean Streets", "year" => 1973), array("director" => "Stanley Kubrick", "title" => "A Clockwork Orange", "year" => 1971)); array_multisort($movies); echo "
"; print_r($movies); echo "";
Результат:
Array
=> Array
=> Alfred Hitchcock
=> Rear Window
=> 1954
)
=> Array
=> Martin Scorsese
=> Mean Streets
=> 1973
)
=> Array
=> Stanley Kubrick
=> A Clockwork Orange
=> 1971
)
=> Array
=> Stanley Kubrick
=> Full Metal Jacket
=> 1987
)
Как видите, array_multisort() отсортирвал массив по director. Когда имя режиссёра повторилось, («Stanley Kubrick»), сортировка пошла по title.
Чтобы отсортровать в обратном порядке, укажите SORT_DESC-флаг как второй аргумент array_multisort(). Просто!
Итог
В этом уроке мы посмотрели на простые PHP-функции для сортровки массива:
* sort() и rsort() для сортровки индексируемых массивов
* asort() и arsort() для сортровки асоциативных массивов
* ksort() и krsort() для сортровки ассоциативнх массивов по ключу
* array_multisort() для сортировки для сортировки сложных и многомерных массивов
PHP-сортировка массивов очень мощна и проста, можно сортировать быстро и как угодно). ТОлько тут мы изучили аж 13 функций! Чтобы увидеть больше, смотрите
Наткнулся тут на интересный блог – блог про блоги так сказать) Автор обзоры делает)
Подпишись на каталога блога
» »
(PHP 4, PHP 5, PHP 7)
array_multisort — Сортирует несколько массивов или многомерные массивы
Описание
Функция array_multisort() может быть использована для сортировки сразу нескольких массивов или одного многомерного массива в соответствии с одной или несколькими размерностями.
Array1_sort_order
Порядок для сортировки вышеуказанного аргумента array . Или SORT_ASC для сортировки по возрастанию, или SORT_DESC для сортировки по убыванию.
Этот аргумент может меняться местами с array1_sort_flags или вообще быть пропущенным. В этом случае подразумевается значение SORT_ASC .
Array1_sort_flags
Настройки сортировки для вышеуказанного аргумента array :
Флаг способа сортировки:
- SORT_REGULAR - обычное сравнение элементов (без изменения типов)
- SORT_NUMERIC - сравнение элементов как чисел
- SORT_STRING - сравнение элементов как строк
- SORT_LOCALE_STRING - сравнение элементов как строк, учитывая текущую локаль. Используется локаль, которую можно менять с помощью функции setlocale()
- SORT_NATURAL - сравнение элементов как строк с использованием алгоритма "natural order", так же как в функции natsort()
- SORT_FLAG_CASE - может быть объединен (бинарное OR) с SORT_STRING или SORT_NATURAL для сортировки без учета регистра
Этот аргумент может меняться местами с array1_sort_order или вообще быть пропущенным. В этом случае подразумевается значение SORT_REGULAR .
...Дополнительные массивы, необязательно следующие после порядка сортировки и флагов.
Возвращаемые значения
Возвращает TRUE в случае успешного завершения или FALSE в случае возникновения ошибки.
Список изменений
Примеры
Пример #1 Сортировка нескольких массивов
$ar1
= array(10
,
100
,
100
,
0
);
$ar2
= array(1
,
3
,
2
,
4
);
array_multisort
($ar1
,
$ar2
);
Var_dump
($ar1
);
var_dump
($ar2
);
?>
В вышеприведенном примере, после того, как будет осуществлена сортировка, первый массив будет содержать 0, 10, 100, 100. Второй - 4, 1, 2, 3. Элементы второго массива, соответствующие идентичным элементам первого (100 и 100), также будут отсортированы.
array(4) { => int(0) => int(10) => int(100) => int(100) } array(4) { => int(4) => int(1) => int(2) => int(3) }
Пример #2 Сортировка многомерного массива
$ar
= array(
array("10"
,
11
,
100
,
100
,
"a"
),
array(1
,
2
,
"2"
,
3
,
1
)
);
array_multisort
($ar
[
0
],
SORT_ASC
,
SORT_STRING
,
$ar
[
1
],
SORT_NUMERIC
,
SORT_DESC
);
var_dump
($ar
);
?>
В вышеприведенном примере, после сортировки, первый массив будет содержать "10", 100, 100, 11, "a" (его элементы были отсортированы в возрастающем порядке), а второй массив будет содержать 1, 3, "2", 2, 1 (элементы отсортированы как числа, в порядке убывания).
array(2) { => array(5) { => string(2) "10" => int(100) => int(100) => int(11) => string(1) "a" } => array(5) { => int(1) => int(3) => string(1) "2" => int(2) => int(1) } }
Пример #3 Сортировка результатов из базы данных
В этом примере, каждый элемент массива data представляет собой ряд таблицы. Такой тип данных типичен для записей базы данных.
Примерные данные:
# том | издание volume | edition -------+-------- 67 | 2 86 | 1 85 | 6 98 | 2 86 | 6 67 | 7
Данные представлены в виде массива с именем data . Обычно их можно получить, к пример, с помощью цикла из функции mysql_fetch_assoc() .
$data
= array("volume"
=>
67
,
"edition"
=>
2
);
$data
= array("volume"
=>
86
,
"edition"
=>
1
);
$data
= array("volume"
=>
85
,
"edition"
=>
6
);
$data
= array("volume"
=>
98
,
"edition"
=>
2
);
$data
= array("volume"
=>
86
,
"edition"
=>
6
);
$data
= array("volume"
=>
67
,
"edition"
=>
7
);
?>
В нашем примере мы будем сортировать по volume в убывающем порядке, а по edition - в возрастающем.
У нас есть массив строк, но array_multisort() необходим массив столбцов, поэтому сначала мы используем следующий код для получения столбцов, а потом выполним сортировку.
// Получение списка столбцов
foreach ($data
as
$key
=>
$row
) {
$volume
[
$key
] =
$row
[
"volume"
];
$edition
[
$key
] =
$row
[
"edition"
];
}
// Сортируем данные по volume по убыванию и по edition по возрастанию
// Добавляем $data в качестве последнего параметра, для сортировки по общему ключу
array_multisort
($volume
,
SORT_DESC
,
$edition
,
SORT_ASC
,
$data
);
?>
Доброго времени суток, уважаемые читатели нашего блога! На нашем сайте мы уже касались темы массивов и это был пример того, как сделать . Также уже была статья о том, для решения этой задачи тоже были использованы массивы. А сегодня речть пойдет о том, как отсортировать многомерный массив
. Итак, приступим.
Возьмем массив «goods» следующего вида:
200, "manufacture" => "ТОО Целина"); $goods = array("price" => 400, "manufacture" => "ИП Девяткин"); $goods = array("price" => 800, "manufacture" => "АО Аграрник"); $goods = array("price" => 790, "manufacture" => "ЗАО Красный Восток"); ?>
Необходимо отсортировать данный массив по ключу. Для этого воспользуемся функцией «ksort»:
ksort ($goods); print_r($goods); ?>
В результате получаем отсортированный массив по ключу:
Array ( => Array ( => 400 => ИП Девяткин) => Array ( => 200 => ТОО Целина) => Array ( => 800 => АО Аграрник) => Array ( => 790 => ЗАО Красный Восток))
Как видим, ключи идут в порядке возрастания от 45 до 89. Теперь нужно отсортировать массив по значению ключа «price» для этого воспользуемся функцией «uasort» и напишем для неё пользовательскую функцию «sort_p»:
sort_p ($a, $b) { return strcmp($a["price"], $b["price"]); } uasort ($goods, "sort_p" ); print_r($goods); ?>
В результате получаем отсортированный массив по ключу «price»:
Array ( => Array ( => 200 => ТОО Целина) => Array ( => 400 => ИП Девяткин) => Array ( => 790 => ЗАО Красный Восток) => Array ( => 800 => АО Аграрник))
Как видим, значения ключа «price» идут в порядке возрастания от 200 до 800. Чтобы значения ключа «price» шли в обратном порядке, по убыванию, поменяем местами параметры функции «strcmp» в пользовательской функции «sort_p»:
b ["price"], $a ["price"]); } uasort($goods, "sort_p"); print_r($goods); ?>
Получим следующий результат:
Array ( => Array ( => 800 => АО Аграрник) => Array ( => 790 => ЗАО Красный Восток) => Array ( => 400 => ИП Девяткин) => Array ( => 200 => ТОО Целина))
Как видим, теперь значения ключа «price» идут в порядке убывания от 800 до 200. Теперь нужно отсортировать массив по значению двух ключей «manufacture» и «price» для этого напишем пользовательскую функцию «sort_pm»:
sort_pm ($a, $b) { $r1 = strcmp($a["manufacture"], $b["manufacture"]$a["price"], $b["price"]) : $r1; } uasort($goods, "sort_pm" ); print_r($goods); ?>
Теперь сортировка происходит по значениям двух ключей в порядке возрастания, приоритетным является ключ «manufacture».
Array ( => Array ( => 800 => АО Аграрник) => Array ( => 790 => ЗАО Красный Восток) => Array ( => 400 => ИП Девяткин) => Array ( => 200 => ТОО Целина))
Если для Вас более приоритетным являются значения ключа «price», то поменяйте местами параметры функций «strcmp» и запишите функцию «sort_pm» следующим образом:
$a["price"], $b["price"] ); return ($r1 == 0) ? strcmp() : $r1; } uasort($goods, "sort_pm"); print_r($goods); ?>
То есть были изменены параметры функций «strcmp». Теперь значения ключа «price» будут приоритетнее, значит сортировка в первую очередь будет осуществлятся по ним, затем будут отсортированы значения ключа «manufacture». Поясним на следующем примере:
200, "manufacture" => "ТОО Целина"); $goods = array("price" => 400, "manufacture" => "ИП Девяткин"); $goods = array("price" => 400, "manufacture" => "АО Праздник"); $goods = array("price" => 800, "manufacture" => "АО Аграрник"); $goods = array("price" => 790, "manufacture" => "ЗАО Красный Восток"); function sort_pm($a, $b) { $r1 = strcmp($a["price"], $b["price"] ); return ($r1 == 0) ? strcmp($a["manufacture"], $b["manufacture"] ) : $r1; } uasort($goods, "sort_pm"); print_r($goods); ?>
Последнее обновление: 1.11.2015
Функция is_array
Функция is_array() проверяет, является ли переменная массивом, и если является, то возвращает true , иначе возвращает false . Например:
$isar = is_array($technics); echo ($isar==true)?"это массив":"это не массив";
Функции count/sizeof
Функция count() и sizeof() получают количество элементов массива:
$number = count($technics); // то же самое, что // $number = sizeof($technics); echo "В массиве technics $number элементов";
Функции shuffle
Функция shuffle перемешивает элементы массивы случайным образом:
$os = array("Windows 95", "Windows XP", "Windows Vista", "Windows 7", "Windows 8", "Windows 10"); shuffle($os); print_r($os); // один из возможных вариантов // Array ( => Windows 95 => Windows 7 => Windows Vista => Windows XP => Windows 10 => Windows 8)
Функции compact
Функция compact позволяет создать из набора переменных ассоциативный массив, где ключами будут сами имена переменных:
Apple II => Apple => 1978) ?>
Функция compact получает в скобках набор переменных. Каждая переменная указывается в кавычка без знака $. Результатом функции является новый массив.
Сортировка массивов
В PHP имеются два типа сортировки: сортировка строк по алфавиту и сортировка чисел по возрастанию/убыванию. Если сортируемые значения представляют строки, то они сортируются по алфавиту, если числа - то они сортируются в порядке возрастания чисел. PHP по умолчанию самостоятельно выбирает тип сортировки.
Для сортировки по возрастанию используется функция asort :
"Lenovo IdeaTab A3500", "samsung" => "Samsung Galaxy Tab 4", "apple" => "Apple iPad Air"); asort($tablets); echo "
- ";
foreach ($tablets as $key => $value)
{
echo "
- $key: $value "; } echo "
В данном случае значения массива представляют строки, поэтому PHP выберет сортировку по алфавиту. Однако с помощью дополнительного параметра мы можем явно указать интерпретатору PHP тип сортировки. Данный параметр может принимать три значения:
SORT_REGULAR: автоматический выбор сортировки
SORT_NUMERIC: числовая сортировка
SORT_STRING: сортировка по алфавиту
Укажем явно тип сортировки:
Asort($tablets, SORT_STRING);
Чтобы отсортировать массив в обратном порядке, применяется функция arsort :
Arsort($tablets);
Сортировка по ключам
Функция asort производит сортировку по значениям элементов, но также существует и еще и сортировка по ключам. Она представлена функцией ksort :
Ksort($tablets, SORT_STRING);
Сортировка по ключам в обратном порядке выполняется функцией krsort() :
Krsort($tablets);
Естественная сортировка
Хотя выше описанные функции сортировки прекрасно выполняют свою работу, но их возможностей все-таки недостаточно. Например, отсортируем по возрастанию следующий массив:
Windows 10 => Windows 7 => Windows 8) ?>
Так как значения представляют строки, то PHP сортирует по алфавиту. Однако подобная сортировка не учитывает числа и регистр. Поэтому значение "Windows 10" будет идти в самом начале, а не в конце, как должно было быть. И для решения этой проблемы в PHP есть функция natsort() , которая выполняет естественную сортировку:
Windows 7 => Windows 8 => Windows 10) ?>
Если нам надо еще при этом, чтобы сортировка не учитывала регистр, то мы можем применить функцию natcasesort() .
Похожие статьи