Files
php-doc-ru/reference/array/functions/array-multisort.xml
2024-02-28 17:07:13 +03:00

379 lines
13 KiB
XML
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?xml version="1.0" encoding="utf-8"?>
<!-- EN-Revision: 6a6f43d1c490a57b452656db285de6d136055ed2 Maintainer: shein Status: ready -->
<!-- Reviewed: no -->
<refentry xml:id="function.array-multisort" xmlns="http://docbook.org/ns/docbook">
<refnamediv>
<refname>array_multisort</refname>
<refpurpose>Сортирует несколько массивов или многомерные массивы</refpurpose>
</refnamediv>
<refsect1 role="description">
&reftitle.description;
<methodsynopsis>
<type>bool</type><methodname>array_multisort</methodname>
<methodparam><type>array</type><parameter role="reference">array1</parameter></methodparam>
<methodparam choice="opt"><type>mixed</type><parameter>array1_sort_order</parameter><initializer>SORT_ASC</initializer></methodparam>
<methodparam choice="opt"><type>mixed</type><parameter>array1_sort_flags</parameter><initializer>SORT_REGULAR</initializer></methodparam>
<methodparam rep="repeat"><type>mixed</type><parameter>rest</parameter></methodparam>
</methodsynopsis>
<para>
Функцией <function>array_multisort</function> пользуются для
одновременной сортировки нескольких массивов или одного многомерного массива
по одному или несколькими уровням вложенности.
</para>
<para>
Ассоциативные строковые (<type>string</type>) ключи будут сохранены, но
числовые ключи будут переиндексированы.
</para>
&note.sort-unstable;
&note.reset-index;
</refsect1>
<refsect1 role="parameters">
&reftitle.parameters;
<para>
<variablelist>
<varlistentry>
<term><parameter>array1</parameter></term>
<listitem>
<para>
Сортируемый массив (<type>array</type>).
</para>
</listitem>
</varlistentry>
<varlistentry>
<term><parameter>array1_sort_order</parameter></term>
<listitem>
<para>
Порядок сортировки предыдущего аргумента массива (<type>array</type>).
Указывают константу <constant>SORT_ASC</constant> для сортировки по возрастанию
или константу <constant>SORT_DESC</constant> для сортировки по убыванию.
</para>
<para>
Этот аргумент разрешено менять местами с аргументом <parameter>array1_sort_flags</parameter>
или не указывать, тогда функция возьмёт за основу значение <constant>SORT_ASC</constant>.
</para>
</listitem>
</varlistentry>
<varlistentry>
<term><parameter>array1_sort_flags</parameter></term>
<listitem>
<para>
Настройки сортировки для предыдущего аргумента массива (<type>array</type>):
</para>
<para>
Флаг способа сортировки:
<itemizedlist>
<listitem>
<simpara><constant>SORT_REGULAR</constant> — обычное сравнение элементов
(без изменения типов)</simpara>
</listitem>
<listitem>
<simpara><constant>SORT_NUMERIC</constant> — числовое сравнение элементов</simpara>
</listitem>
<listitem>
<simpara><constant>SORT_STRING</constant> — строковое сравнение элементов</simpara>
</listitem>
<listitem>
<simpara>
<constant>SORT_LOCALE_STRING</constant> — строковое сравнение элементов
с учётом установленного языкового стандарта (локали). Функция выберет языковой стандарт,
который разрешено изменять функцией <function>setlocale</function>
</simpara>
</listitem>
<listitem>
<simpara>
<constant>SORT_NATURAL</constant> — строковое сравнение элементов
через алгоритм естественной сортировки (natural order), как в функции <function>natsort</function>
</simpara>
</listitem>
<listitem>
<simpara>
<constant>SORT_FLAG_CASE</constant> — разрешено объединять через бинарное ИЛИ
с константой <constant>SORT_STRING</constant>
или <constant>SORT_NATURAL</constant> для сортировки строк без учёта регистра
</simpara>
</listitem>
</itemizedlist>
</para>
<para>
Этот аргумент разрешено менять местами с аргументом <parameter>array1_sort_order</parameter>
или не указывать, тогда функция возьмёт за основу значение <constant>SORT_REGULAR</constant>.
</para>
</listitem>
</varlistentry>
<varlistentry>
<term><parameter>rest</parameter></term>
<listitem>
<para>
Дополнительные массивы, за которыми необязательно идёт направление сортировки и флаги.
Функция сравнивает только элементы, которые соответствуют эквивалентным элементам
в предыдущих массивах. То есть функция сортирует массивы в лексикографическом порядке.
</para>
</listitem>
</varlistentry>
</variablelist>
</para>
</refsect1>
<refsect1 role="returnvalues">
&reftitle.returnvalues;
<para>
&return.success;
</para>
</refsect1>
<refsect1 role="examples">
&reftitle.examples;
<para>
<example>
<title>Сортировка нескольких массивов</title>
<programlisting role="php">
<![CDATA[
<?php
$ar1 = array(10, 100, 100, 0);
$ar2 = array(1, 3, 2, 4);
array_multisort($ar1, $ar2);
var_dump($ar1);
var_dump($ar2);
?>
]]>
</programlisting>
<para>
В приведённом примере после сортировки
первый массив будет содержать значения: 0, 10, 100, 100.
Второй — 4, 1, 2, 3. Функция также отсортировала записи во втором
массиве, которые соответствуют одинаковым записям в первом массиве (100 и 100).
</para>
<screen>
<![CDATA[
array(4) {
[0]=> int(0)
[1]=> int(10)
[2]=> int(100)
[3]=> int(100)
}
array(4) {
[0]=> int(4)
[1]=> int(1)
[2]=> int(2)
[3]=> int(3)
}
]]>
</screen>
</example>
</para>
<para>
<example>
<title>Сортировка многомерного массива</title>
<programlisting role="php">
<![CDATA[
<?php
$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);
?>
]]>
</programlisting>
<para>
В этом примере после сортировки функция преобразует первый массив в:
«10», 100, 100, 11, «a» (функция отсортировала его элементы как строки
в возрастающем порядке). Второй массив будет содержать: 1, 3, «2», 2, 1
(функция отсортировала элементы как числа в порядке убывания).
</para>
<screen>
<![CDATA[
array(2) {
[0]=> array(5) {
[0]=> string(2) "10"
[1]=> int(100)
[2]=> int(100)
[3]=> int(11)
[4]=> string(1) "a"
}
[1]=> array(5) {
[0]=> int(1)
[1]=> int(3)
[2]=> string(1) "2"
[3]=> int(2)
[4]=> int(1)
}
}
]]>
</screen>
</example>
</para>
<para>
<example>
<title>Сортировка результатов из базы данных</title>
<para>
В этом примере каждый элемент массива <varname>data</varname>
это строка таблицы. Такой набор данных типичен для
записей базы данных.
</para>
<para>
Примерные данные:
</para>
<screen>
<![CDATA[
# том | издание
volume | edition
-------+--------
67 | 2
86 | 1
85 | 6
98 | 2
86 | 6
67 | 7
]]>
</screen>
<para>
Данные в виде массива с именем <varname>data</varname>. Такие
данные обычно получают в цикле, например, функцией <function>mysqli_fetch_assoc</function>.
</para>
<programlisting role="php">
<![CDATA[
<?php
$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);
?>
]]>
</programlisting>
<para>
В этом примере функция отсортирует данные по полю <varname>volume</varname>
по убыванию, а по полю <varname>edition</varname> — по возрастанию.
</para>
<para>
Мы получили массив строк базы данных, но функция <function>array_multisort</function>
требует массив столбцов, поэтому сначала вызовем код, который
получит столбцы, а затем отсортируем данные.
</para>
<programlisting role="php">
<![CDATA[
<?php
// Получаем список столбцов
foreach ($data as $key => $row) {
$volume[$key] = $row['volume'];
$edition[$key] = $row['edition'];
}
// Получение тех же данных функцией array_column() вместо перебора
$volume = array_column($data, 'volume');
$edition = array_column($data, 'edition');
// Сортируем данные по полю volume по убыванию и по полю edition по возрастанию
// Добавляем переменную $data в качестве последнего параметра, для сортировки по общему ключу
array_multisort($volume, SORT_DESC, $edition, SORT_ASC, $data);
?>
]]>
</programlisting>
<para>
Функция отсортировала набор данных и теперь он выглядит вот так:
</para>
<screen>
<![CDATA[
volume | edition
-------+--------
98 | 2
86 | 1
86 | 6
85 | 6
67 | 2
67 | 7
]]>
</screen>
</example>
</para>
<para>
<example>
<title>Сортировка без учёта регистра</title>
<para>
Обе константы — <constant>SORT_STRING</constant>
и <constant>SORT_REGULAR</constant> — учитывают регистр при
сортировке, поэтому строки, которые начинаются с заглавной буквы, будут
идти раньше строк, которые начинаются со строчной буквы.
</para>
<para>
Чтобы отсортировать данные без учёта регистра, порядок сортировки
определяют для копии исходного массива, которую привели к нижнему регистру.
</para>
<programlisting role="php">
<![CDATA[
<?php
$array = array('Alpha', 'atomic', 'Beta', 'bank');
$array_lowercase = array_map('strtolower', $array);
array_multisort($array_lowercase, SORT_ASC, SORT_STRING, $array);
print_r($array);
?>
]]>
</programlisting>
&example.outputs;
<screen>
<![CDATA[
Array
(
[0] => Alpha
[1] => atomic
[2] => bank
[3] => Beta
)
]]>
</screen>
</example>
</para>
</refsect1>
<refsect1 role="seealso">
&reftitle.seealso;
<para>
<simplelist>
<member><function>usort</function></member>
<member>&seealso.array.sorting;</member>
</simplelist>
</para>
</refsect1>
</refentry>
<!-- Keep this comment at the end of the file
Local variables:
mode: sgml
sgml-omittag:t
sgml-shorttag:t
sgml-minimize-attributes:nil
sgml-always-quote-attributes:t
sgml-indent-step:1
sgml-indent-data:t
indent-tabs-mode:nil
sgml-parent-document:nil
sgml-default-dtd-file:"~/.phpdoc/manual.ced"
sgml-exposed-tags:nil
sgml-local-catalogs:nil
sgml-local-ecat-files:nil
End:
vim600: syn=xml fen fdm=syntax fdl=2 si
vim: et tw=78 syn=sgml
vi: ts=1 sw=1
-->