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
Sergey Panteleev daef8df962 Обнуление тега Reviewed (#364)
[skip-lint]
[skip-spellcheck]
2021-11-16 13:03:53 +03:00

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