1
0
mirror of https://github.com/php/doc-ru.git synced 2026-03-24 15:52:13 +01:00
Files
archived-doc-ru/reference/array/functions/array-map.xml
2025-10-17 23:55:57 +03:00

500 lines
13 KiB
XML
Raw Permalink 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: 1f5bcc30ee06e452b98362460ea7b7bf2b20f4a1 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
-->