1
0
mirror of https://github.com/php/doc-ru.git synced 2026-03-26 08:42:13 +01:00
Files
archived-doc-ru/reference/array/functions/array-multisort.xml
Mikhail Alferov 53a4441dcb Обновление перевода (#728)
Co-authored-by: Sergey Panteleev <sergey@php.net>
2024-01-17 00:23:00 +03:00

377 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
-->