1
0
mirror of https://github.com/php/doc-ru.git synced 2026-03-25 16:22:18 +01:00
Files
archived-doc-ru/reference/array/functions/array-multisort.xml
Andrey Gromov cf4cbcb9e9 5 updated
git-svn-id: https://svn.php.net/repository/phpdoc/ru/trunk@340400 c90b9560-bf6c-de11-be94-00142212c4b1
2016-10-09 07:49:29 +00:00

399 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: 5c65942664074e1a707e89fbc6887860287d60e9 Maintainer: shein Status: ready -->
<!-- Reviewed: yes -->
<!-- $Revision$ -->
<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 choice="opt"><type>mixed</type><parameter>...</parameter></methodparam>
</methodsynopsis>
<para>
Функция <function>array_multisort</function> может быть использована для
сортировки сразу нескольких массивов или одного многомерного массива
в соответствии с одной или несколькими размерностями.
</para>
<para>
Ассоциативные (<type>string</type>) ключи будут сохранены, но
числовые ключи будут переиндексированы.
</para>
&note.sort-unstable;
</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> - может быть объединен
(бинарное OR) с
<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>...</parameter></term>
<listitem>
<para>
Дополнительные массивы, необязательно следующие после порядка сортировки и флагов.
Сравниваются только элементы соответствующие таким же элементам в
предыдущих массивах. Другими словами, производится сортировка в
лексикографическом порядке.
</para>
</listitem>
</varlistentry>
</variablelist>
</para>
</refsect1>
<refsect1 role="returnvalues">
&reftitle.returnvalues;
<para>
&return.success;
</para>
</refsect1>
<refsect1 role="changelog">
&reftitle.changelog;
<para>
<informaltable>
<tgroup cols="2">
<thead>
<row>
<entry>&Version;</entry>
<entry>&Description;</entry>
</row>
</thead>
<tbody>
<row>
<entry>5.4.0</entry>
<entry>
Добавлены <constant>SORT_NATURAL</constant> и <constant>SORT_FLAG_CASE</constant>
в возможные флаги сортировки <parameter>array1_sort_flags</parameter>.
</entry>
</row>
<row>
<entry>5.3.0</entry>
<entry>
Добавлен <constant>SORT_LOCALE_STRING</constant> в возможные флаги сортировки
<parameter>array1_sort_flags</parameter>.
</entry>
</row>
</tbody>
</tgroup>
</informaltable>
</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'];
}
// Сортируем данные по 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
-->