【PHP入門】array_mapで配列の全要素に特定の関数を適用させる

こんにちは!ライターのmuramatsuです。

PHPでは配列の要素をまとめてある処理ができるのをご存知ですか?

この記事では、

  • array_map関数とは
  • array_map関数の基本的な使い方

という基本的な内容から、

  • array_map関数で文字列を分割する
  • ループでarray_map関数を使用する
  • array_map関数で配列を結合する

などの応用的な使い方に関しても解説していきます。

今回はそんなarray_map関数の使い方ついて、わかりやすく解説します!

目次

array_map関数とは

配列の要素全てに対して、指定した関数を適用させる場合にarray_map関数を使用します。

例えば配列[1,2,3,4]のそれぞれの要素に3を掛ける、と言うことが簡単にできるようになります。

これはarray_map関数がコールバック関数を使い、それぞれの要素に処理を行えるようにしています。

コールバック関数とは、関数の引数に別の関数を渡すことを呼びます。

例えば関数Aの引数に関数Bを渡した場合、関数Aの中で関数Bで処理された結果が処理され、関数Aの結果が返ってきます。

array_map関数を使用すると引数に指定したコールバック関数が呼び出され、同じく引数に指定した配列の各要素が呼び出されたコールバック関数の中で処理されます。

array_map関数は以下のように記述します。

基本構文:

array array_map( コールバック関数名 , $配列1 [, $配列2, $… ] )

引数:

第一引数にコールバック関数名を指定します。

第二引数からはコールバック関数に適用する配列名を1つ又は複数指定します。

複数の配列を指定する場合は、カンマ(,)で区切ります。

返り値:

コールバック関数適用後の全ての要素を含む配列を返します。

array_map関数の基本的な使い方

ここではarray_map関数の基本的な使い方として、配列の要素が整数・文字列の場合と、配列が複数ある場合や、連想配列の場合を見ていきましょう。

配列に特定の関数を渡す

以下にarray_map関数を使用して、コールバック関数に配列のすべての要素を渡す方法を記述します。

配列の要素が整数の場合

サンプルプログラム1

<?php

//コールバック関数
function valuecalc($n)
{
    return($n + $n);
}

$value_array = [100, 200, 300, 400, 500];

//array_mapを使用して配列のすべての要素を返す
$value_array2 = array_map('valuecalc', $value_array);

print_r($value_array2);

?>

実行結果

Array
(
    [0] => 200
    [1] => 400
    [2] => 600
    [3] => 800
    [4] => 1000
)

サンプルでは設定した配列$value_arrayの要素1つ1つを、array_map関数を使ってコールバック関数valuecalcに渡し、要素の値に加算して返す処理を行なっています。

配列の要素が文字列の場合

サンプルプログラム2

<?php

//コールバック関数
function valuestrs($str)
{
	return $str. '曜日';
}

$week = ['月', '火', '水', '木', '金', '土', '日'];

//array_mapを使用して配列のすべての要素を返す
$weeks = array_map('valuestrs', $week);

print_r($weeks);

?>

実行結果

Array
(
    [0] => 月曜日
    [1] => 火曜日
    [2] => 水曜日
    [3] => 木曜日
    [4] => 金曜日
    [4] => 土曜日
    [4] => 日曜日
)

配列の要素が文字列の場合でも、整数の時と同じく配列の要素にコールバック関数が適用されて返ってきます。

コールバック関数valuestrsは、引数と’曜日’を結合させる処理をしてarray_mapに返し、その結果を代入した$weeksをprint_rで出力しています。

複数の配列に特定の関数を渡す

次に配列が複数ある場合は、どのようになるのかをサンプルで見てみましょう。

サンプルプログラム

<?php

//コールバック関数
function valuecalc($a, $b, $c)
{
	return($a + $b - $c);
}

$value_array1 = [100, 200, 300, 400, 500];
$value_array2 = [500, 400, 300, 200, 100];
$value_array3 = [10, 20, 30, 40, 50];

//array_mapを使用して配列のすべての要素を返す
$value_array4 = array_map('valuecalc', $value_array1, $value_array2, $value_array3);

print_r($value_array4);

?>

実行結果

Array
(
    [0] => 590
    [1] => 580
    [2] => 570
    [3] => 560
    [4] => 550
)

配列が複数ある場合は、array_mapの引数で配列をカンマ(,)で区切って指定します。

この場合、コールバック関数の引数の順番がそのまま適応されるのでarray_map内の配列を指定する順番には注意しましょう。

もし$value_array4 = array_map(‘valuecalc’, $value_array1, $value_array3, $value_array2);のように、$value_array2と$value_array3の順番を入れ替えると、結果は500、400、300、200、100となります。

連想配列に特定の関数を渡す

連想配列の場合でも、使い方は配列の時とほとんど変わりませんが、1つの連想配列か、複数の連想配列かで、実行結果のキーの値が変わってきます。

1つの連想配列の場合

サンプルプログラム1

<?php

//コールバック関数
function valuestrs($str)
{
	return $str. '曜日';
}

$week = [
         'Monday' => '月',
         'Tuesday' => '火',
         'Wednesday' => '水',
         'Thursday' => '木',
         'Friday' => '金',
         'Saturday' => '土',
         'Sunday' => '日'
        ];

//array_mapを使用して配列のすべての要素を返す
$weeks = array_map('valuestrs', $week);

print_r($weeks);

?>

実行結果

Array ( 
       [Monday] => 月曜日 
       [Tuesday] => 火曜日 
       [Wednesday] => 水曜日 
       [Thursday] => 木曜日 
       [Friday] => 金曜日 
       [Saturday] => 土曜日 
       [Sunday] => 日曜日 
)

連想配列が1つの場合、キーとなる部分(ここではMondayやTuesdayなど)はそのまま保持され、値の部分にコールバック関数が適用されます。

連想配列が複数の場合

サンプルプログラム2

<?php

//コールバック関数
function valuestrs($str1, $str2)
{
	return $str1. '='. $str2. '曜日';
}

$weekE = [
         'Monday' => 'Mon',
         'Tuesday' => 'Tu',
         'Wednesday' => 'Wed',
         'Thursday' => 'Th',
         'Friday' => 'Fri',
         'Saturday' => 'Sat',
         'Sunday' => 'Sun'
        ];


$weekJ = [
          'Monday' => '月',
          'Tuesday' => '火',
          'Wednesday' => '水',
          'Thursday' => '木',
          'Friday' => '金',
          'Saturday' => '土',
          'Sunday' => '日'
         ];


//array_mapを使用して配列のすべての要素を返す
$weeks = array_map('valuestrs', $weekE, $weekJ);

print_r($weeks);

?>

実行結果

Array ( 
       [0] => Mon=月曜日 
       [1] => Tu=火曜日 
       [2] => Wed=水曜日 
       [3] => Th=木曜日 
       [4] => Fri=金曜日 
       [5] => Sat=土曜日 
       [6] => Sun=日曜日 
)

連想配列が1つの場合はキー部分は保持されましたが、複数の連想配列になるとキーは保持されなくなり、番号でのキーになってしまいます。

array_map関数の応用的な使い方

array_map関数で配列を結合する

array_map関数は第一引数にNULLを指定することで、配列を結合することができます。

基本構文:

array_map(null, $配列名1, $配列名2[, $配列3, $…])

引数:

第一引数にNULLを指定します。

第二引数以降に結合したい配列名をカンマ(,)で区切って指定します。

以下にarray_map関数を使用して第二、第三引数に指定した配列を結合する方法を記述します。

サンプルプログラム

<?php

$fruits_key = ['apple', 'orange', 'melon'];
$fruits_value = ["100円", "250円", "300円"];

$fruits = array_map(null, $fruits_key, $fruits_value);
print_r($fruits);

?>

実行結果

Array
(
    [0] => Array
        (
            [0] => apple
            [1] => 100円
        )

    [1] => Array
        (
            [0] => orange
            [1] => 250円
        )

    [2] => Array
        (
            [0] => melon
            [1] => 300円
        )

)

実行結果のとおり第二、第三引数に指定した配列が結合されていることがわかりますね!

さまざまな配列の結合方法については、以下の記事で詳しく解説しています!

文字列を分割して値を特定の関数で処理する

array_map関数は第二引数に配列を指定しますが、配列を返す関数を引数として指定することも可能です。

explode関数は、文字列を分割するのに使用され、区切った文字列を配列にして返す処理をしてくれます。

基本構文:

array_map (‘コールバック関数名’, explode(‘区切り文字’, $区切りたい文字列の入った変数));

引数:

第一引数は基本と同じくコールバック関数名を指定します。

第二引数に文字列を分割するexplode関数を指定します。

explode関数の第一引数には区切り文字を指定し、第二引数に文字列が代入されている変数名を指定します。

早速、カンマ(,)区切りの文字列をexplode関数の引数に指定して、コールバック関数に渡す簡単なサンプルを見てみましょう。

サンプルプログラム

<?php

//コールバック関数
function fruits_trim($n)
{
	echo 'How much is this '. $n. '? 
';
}

$fruits_str = 'apple,orange,banana,pineapple,mango';

//explodeで文字列をカンマ区切りで分割する
array_map('fruits_trim', explode(',', $fruits_str));

?>

実行結果

How much is this apple? 
How much is this orange? 
How much is this banana? 
How much is this pineapple? 
How much is this mango? 

array_map関数の第二引数にexplodeを指定して文字列を区切り、それぞれの要素(appleやorangeなど)に分けられた値をコールバック関数fruits_trimに渡しています。

渡されたそれぞれの値(appleやorangeなど)が関数fruits_trimで処理されています。

explode関数について詳しく知りたい方は、以下の記事を参考にしてみてくださいね。

ループの中でarray_map関数を使用する

foreach文を使用して、ループの中でarray_map関数を使用することも可能です。

foreach分の中でarray_mapを使用すると、配列の全要素をそれぞれ要素数分回して、その値をコールバック関数に渡して処理してくれます。

基本構文:

foreach ($配列名 as $value) {
$変数 = array_map(コールバック関数, $配列名);
処理

}

サンプルで3つの要素を持った配列の値の変化をみてみましょう。

サンプルプログラム

<?php

//コールバック関数
function valuecalc($n)
{
    return($n + $n);
}

$value_array = [10, 20, 30];

foreach($value_array as $value){

  $value_array = array_map('valuecalc', $value_array);
  print_r($value_array);

}

?>

実行結果

Array
(
    [0] => 20
    [1] => 40
    [2] => 60
)
Array
(
    [0] => 40
    [1] => 80
    [2] => 120
)
Array
(
    [0] => 80
    [1] => 160
    [2] => 240
)

foreach文の中に書かれたarray_mapは配列の全要素をコールバック関数に渡して、演算結果を返しています。

返ってきたそれぞれ3つの結果(20,40,60)は$value_arrayに返され、その値のまま2回目のループになりarray_mapでコールバック関数に渡して3回目のループになり、、、の繰り返しが配列の要素数分行われます。

実行結果のとおり、コールバック関数に配列を渡すごとに値が加算されているのがわかりますね。

foreach文についての詳細は以下の記事で解説されています。ぜひ参考にしてみてください。

array関数についてもっと詳しく知りたい方へ

配列を操作するさまざまな関数の使い方については、以下の記事にまとめていますので、ぜひ参考にしてください!

主に以下の配列関数について解説しています!

  • array_sum関数の使い方
  • array_unique関数の使い方
  • array_values関数の使い方
  • array_keys関数の使い方
  • array_filter関数の使い方
  • array_map関数の使い方
  • array_push関数の使い方
  • array_key_exists関数の使い方
  • array_pad関数の使い方
  • implode関数の使い方
  • 配列の削除方法
  • 配列の検索方法
  • よく使用する配列操作

まとめ

ここではarray_map関数について、

  • array_map関数とは
  • array_map関数の基本的な使い方
  • 配列をコールバック関数に渡す
  • array_map関数で文字列を分割する
  • ループでarray_map関数を使用する
  • array_map関数で配列を結合する

などについて解説しました。

array_map関数などの配列を扱う関数は実際の開発でもよく使用しますので、この機会にぜひ覚えておきましょう。

もしarray_map関数の使用方法を忘れてしまったら、この記事を思い出してくださいね!

この記事を書いた人

世界中の人たちと友達になって、その友達の家を巡る旅をしたいと密かに思っている。

複雑な内容を誰にでもわかりやすく、そして納得のいくような解説をする、をモットーにしています!

目次