Files
php-doc-ru/reference/array/functions/array-map.xml
2024-09-07 14:45:33 +03:00

500 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: 33968dfebb9b847733d02ee221b3b8054a101b41 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-операцию и вернёт массив массивов,
каждый из которых содержит элементы входных массивов с одними и теми же индексами,
как в примере ниже.
Функция <methodname>array_map</methodname> вернёт входной массив,
если передали только аргумент <parameter>array</parameter>.
</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>
<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
-->