Files
php-doc-ru/reference/array/functions/array-map.xml
2022-03-02 15:34:46 +03:00

469 lines
12 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: e8c83816e0ca7a4136a5991b2227ddf00fa9adc6 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-функции.
Количество параметров, передаваемых <parameter>callback</parameter>-функции,
должно совпадать с количеством массивов,
переданным функции <function>array_map</function>.
Лишние входные массивы игнорируются. Если предоставлено недостаточное
количество аргументов, выбрасывается <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>
&null; может быть передан в качестве значения <parameter>callback</parameter>
для выполнения 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>
<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>
Интересным эффектом при использовании этой функции является создание
массива массивов, что может быть достигнуто путём использования
значения &null; в качестве имени callback-функции.
</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 => "$k - это $v";
$result = array_map($callback, array_keys($arr), array_values($arr));
var_dump($result);
?>
]]>
</programlisting>
&example.outputs;
<screen>
<![CDATA[
array(3) {
[0]=>
string(24) "v1 - это Первый выпуск"
[1]=>
string(25) "v2 - это Второй выпуск"
[2]=>
string(24) "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
-->