Files
php-doc-ru/reference/array/functions/array-multisort.xml
Mikhail Alferov 01fd1e80af Update reference/array/functions to En (#1068)
* Update book.xml to en

* Update array-combine.xml to en

* Update array-diff.xml to en

* Update array-fill.xml to en

* Update array-is-list.xml to en

* Update array-map.xml to en

* Update array-merge.xml to en

* Update array-multisort.xml to en

* Update array-pad.xml to en

* Update array-search.xml to en

* Update array-splice.xml to en

* Update array-udiff-uassoc.xml to en

* Update array.xml to en

* Update count.xml to en

* Update current.xml to en

* Update each.xml to en

* Update in-array.xml to en

* Update list.xml to en

* Update next.xml to en

* Update prev.xml to en

* Update usort.xml to en
2025-05-09 09:05:53 +03:00

381 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: 2e60c5134e7a847c99f81eb3f7ecee1f5efeeace 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>
<para>
В следующем примере функция отсортирует данные по полю <varname>volume</varname>
по убыванию, а по полю <varname>edition</varname> — по возрастанию.
</para>
<para>
Мы получили массив строк базы данных, но функция <function>array_multisort</function>
требует массив столбцов, поэтому сначала вызовем код, который
получит столбцы, а затем отсортируем данные.
</para>
<programlisting role="php">
<![CDATA[
<?php
// Данные наподобие тех, которые создаёт функция mysqli_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);
// Получаем список столбцов
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);
// Перебираем данные и выводим отсортированные значения для каждого столбца
echo 'volume | edition', PHP_EOL;
echo '-------+--------', PHP_EOL;
for ($i = 0; $i < count($data); $i++) {
printf("%6d | %7d\n", $volume[$i], $edition[$i]);
}
?>
]]>
</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
-->