1
0
mirror of https://github.com/php/doc-ru.git synced 2026-03-26 00:32:15 +01:00
Files
archived-doc-ru/reference/array/functions/array-map.xml

501 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: sergey Status: ready -->
<!-- Reviewed: no -->
<refentry xml:id="function.array-map" xmlns="http://docbook.org/ns/docbook">
<refnamediv>
<refname>array_map</refname>
<refpurpose>Применяет callback-функцию к элементам массивов</refpurpose>
</refnamediv>
<refsect1 role="description">
&reftitle.description;
<methodsynopsis>
<type>array</type><methodname>array_map</methodname>
<methodparam><type class="union"><type>callable</type><type>null</type></type><parameter>callback</parameter></methodparam>
<methodparam><type>array</type><parameter>array</parameter></methodparam>
<methodparam rep="repeat"><type>array</type><parameter>arrays</parameter></methodparam>
</methodsynopsis>
<para>
Функция <function>array_map</function> возвращает массив (&array;), который содержит
результаты обработки <parameter>callback</parameter>-функцией значений
массива <parameter>array</parameter>,
и значений массивов <parameter>arrays</parameter>, если в функцию передали больше одного массива,
которые функция передаёт как аргументы в callback-функцию.
При вызове функции <function>array_map</function> проверяют, чтобы количество массивов, которое передают в функцию,
совпадало с количеством параметров <parameter>callback</parameter>-функции.
Функция проигнорирует лишние входные массивы. При передаче недостаточного количества
аргументов функция выбросит ошибку <classname>ArgumentCountError</classname>.
</para>
</refsect1>
<refsect1 role="parameters">
&reftitle.parameters;
<para>
<variablelist>
<varlistentry>
<term><parameter>callback</parameter></term>
<listitem>
<para>
Значение с типом <type>callable</type>, которое функция вызовет
на каждом элементе в каждом массиве.
</para>
<para>
При передаче в параметр <parameter>callback</parameter> значения &null;
функция выполнит с массивами zip-операцию и вернёт массив массивов,
каждый из которых содержит элементы входных массивов с одинаковым порядковым номером,
как в примере ниже.
При передаче единственного массива в параметр <parameter>array</parameter>
функция <methodname>array_map</methodname> вернёт входной массив.
</para>
</listitem>
</varlistentry>
<varlistentry>
<term><parameter>array</parameter></term>
<listitem>
<para>
Массив, который функция передаст в <parameter>callback</parameter>-функцию.
</para>
</listitem>
</varlistentry>
<varlistentry>
<term><parameter>arrays</parameter></term>
<listitem>
<para>
Дополнительные массивы для обработки
<parameter>callback</parameter>-функцией.
</para>
</listitem>
</varlistentry>
</variablelist>
</para>
</refsect1>
<refsect1 role="returnvalues">
&reftitle.returnvalues;
<para>
Функция возвращает массив, который содержит
результаты обработки <parameter>callback</parameter>-функцией значений
массива <parameter>array</parameter>,
и значений массивов <parameter>arrays</parameter>, если в функцию передали больше одного массива,
которые функция передаёт как аргументы в callback-функцию.
</para>
<para>
Массив, который вернёт функция, сохранит ключи аргумента-массива,
только если в функцию передали ровно один массив. Массив, который возвращает функция,
будет содержать последовательные целочисленные ключи, если передали больше одного массива.
</para>
</refsect1>
<refsect1 role="changelog">
&reftitle.changelog;
<informaltable>
<tgroup cols="2">
<thead>
<row>
<entry>&Version;</entry>
<entry>&Description;</entry>
</row>
</thead>
<tbody>
&array.changelog.by-ref;
</tbody>
</tgroup>
</informaltable>
</refsect1>
<refsect1 role="examples">
&reftitle.examples;
<para>
<example>
<title>Пример обработки массива функцией <function>array_map</function></title>
<programlisting role="php">
<![CDATA[
<?php
function cube($n)
{
return ($n * $n * $n);
}
$a = [1, 2, 3, 4, 5];
$b = array_map('cube', $a);
print_r($b);
?>
]]>
</programlisting>
<para>
В результате массив <varname>$b</varname> содержит следующие значения:
</para>
<screen>
<![CDATA[
Array
(
[0] => 1
[1] => 8
[2] => 27
[3] => 64
[4] => 125
)
]]>
</screen>
</example>
</para>
<para>
<example>
<title>Пример работы функции <function>array_map</function> с лямбда-функцией</title>
<programlisting role="php">
<![CDATA[
<?php
$func = function (int $value): int {
return $value * 2;
};
print_r(array_map($func, range(1, 5)));
// Или с PHP 7.4.0:
print_r(
array_map(
fn ($value): int => $value * 2,
range(1, 5)
)
);
?>
]]>
</programlisting>
&example.outputs;
<screen>
<![CDATA[
Array
(
[0] => 2
[1] => 4
[2] => 6
[3] => 8
[4] => 10
)
]]>
</screen>
</example>
</para>
<para>
<example>
<title>Пример работы функции <function>array_map</function> с набором массивов</title>
<programlisting role="php">
<![CDATA[
<?php
function show_Spanish(int $n, string $m): string
{
return "Число {$n} по-испански называется {$m}";
}
function map_Spanish(int $n, string $m): array
{
return [$n => $m];
}
$a = [1, 2, 3, 4, 5];
$b = ['uno', 'dos', 'tres', 'cuatro', 'cinco'];
$c = array_map('show_Spanish', $a, $b);
print_r($c);
$d = array_map('map_Spanish', $a, $b);
print_r($d);
?>
]]>
</programlisting>
&example.outputs;
<screen>
<![CDATA[
// Вывод переменной $c
Array
(
[0] => Число 1 по-испански называется uno
[1] => Число 2 по-испански называется dos
[2] => Число 3 по-испански называется tres
[3] => Число 4 по-испански называется cuatro
[4] => Число 5 по-испански называется cinco
)
// Вывод переменной $d
Array
(
[0] => Array
(
[1] => uno
)
[1] => Array
(
[2] => dos
)
[2] => Array
(
[3] => tres
)
[3] => Array
(
[4] => cuatro
)
[4] => Array
(
[5] => cinco
)
)
]]>
</screen>
</example>
</para>
<para>
При обработке двух или большего количества массивов лучше передавать массивы одинаковой длины,
поскольку callback-функция применяется к элементам массивов параллельно, позиции которых соответствуют друг другу.
При обработке массивов разной длины функция расширяет более короткие массивы
элементами с пустыми значениями до размера самого длинного массива.
</para>
<para>
Функция создаёт массив массивов,
когда вместо названия callback-функции передают значение &null;.
</para>
<para>
<example>
<title>Выполнение zip-операции с массивами</title>
<programlisting role="php">
<![CDATA[
<?php
$a = [1, 2, 3, 4, 5];
$b = ['one', 'two', 'three', 'four', 'five'];
$c = ['uno', 'dos', 'tres', 'cuatro', 'cinco'];
$d = array_map(null, $a, $b, $c);
print_r($d);
?>
]]>
</programlisting>
&example.outputs;
<screen>
<![CDATA[
Array
(
[0] => Array
(
[0] => 1
[1] => one
[2] => uno
)
[1] => Array
(
[0] => 2
[1] => two
[2] => dos
)
[2] => Array
(
[0] => 3
[1] => three
[2] => tres
)
[3] => Array
(
[0] => 4
[1] => four
[2] => cuatro
)
[4] => Array
(
[0] => 5
[1] => five
[2] => cinco
)
)
]]>
</screen>
</example>
</para>
<para>
<example>
<title>
Пример работы функции со значением &null; вместо
<parameter>callback</parameter>-функции и единственным массивом <parameter>array</parameter>
</title>
<programlisting role="php">
<![CDATA[
<?php
$array = [1, 2, 3];
var_dump(array_map(null, $array));
?>
]]>
</programlisting>
&example.outputs;
<screen>
<![CDATA[
array(3) {
[0]=>
int(1)
[1]=>
int(2)
[2]=>
int(3)
}
]]>
</screen>
</example>
</para>
<para>
<example>
<title>Пример обработки функцией <function>array_map</function> строковых ключей</title>
<programlisting role="php">
<![CDATA[
<?php
$arr = ['stringkey' => 'value'];
function cb1($a)
{
return [$a];
}
function cb2($a, $b)
{
return [$a, $b];
}
var_dump(array_map('cb1', $arr));
var_dump(array_map('cb2', $arr, $arr));
var_dump(array_map(null, $arr));
var_dump(array_map(null, $arr, $arr));
?>
]]>
</programlisting>
&example.outputs;
<screen>
<![CDATA[
array(1) {
["stringkey"]=>
array(1) {
[0]=>
string(5) "value"
}
}
array(1) {
[0]=>
array(2) {
[0]=>
string(5) "value"
[1]=>
string(5) "value"
}
}
array(1) {
["stringkey"]=>
string(5) "value"
}
array(1) {
[0]=>
array(2) {
[0]=>
string(5) "value"
[1]=>
string(5) "value"
}
}
]]>
</screen>
</example>
<example>
<title>Пример работы функции <function>array_map</function> с ассоциативными массивами</title>
<para>
Функция <function>array_map</function> не поддерживает прямую обработку
ключей массива как входных данных. Для преобразования ключей
во входные значения вызывают функцию <function>array_keys</function>.
</para>
<programlisting role="php">
<![CDATA[
<?php
$arr = [
'v1' => 'Первому выпуску',
'v2' => 'Второму выпуску',
'v3' => 'Третьему выпуску',
];
// Примечание: До версии 7.4.0 анонимные функции записывали длинным, а не коротким синтаксисом
$callback = fn(string $k, string $v): string => "$v присвоили версию $k";
$result = array_map($callback, array_keys($arr), array_values($arr));
var_dump($result);
?>
]]>
</programlisting>
&example.outputs;
<screen>
<![CDATA[
array(3) {
[0]=>
string(64) "Первому выпуску присвоили версию v1"
[1]=>
string(64) "Второму выпуску присвоили версию v2"
[2]=>
string(66) "Третьему выпуску присвоили версию v3"
}
]]>
</screen>
</example>
</para>
</refsect1>
<refsect1 role="seealso">
&reftitle.seealso;
<para>
<simplelist>
<member><function>array_filter</function></member>
<member><function>array_reduce</function></member>
<member><function>array_walk</function></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
-->