[PHP] array_mapのサンプルを作ってみる



Nプログラマです。

今回は、array_mapの使って色々とサンプルを作ってみます。

基本

array_map ( callable $callback , array $array1 [, array $… ] ) : array

最近知ったのですが、第2引数以降は可変リストなんですね。
配列は1コしか渡せないと思いこんでいました。

なプ

マニュアルをよく確認しないと行けないッスね。

基本コード

基本 コードを開く
基本

<?php

$numbers = [10, 20, 30];

array_map(
    function ($value) {
        echo $value, "\n";
    },
    $numbers
);

第1引数には、配列に対する処理を行う関数を渡します。

第2引数には、第1引数の関数に渡す配列を渡します。
配列の個数は任意の数を渡せますが、任意の個数と、第1引数の関数が取る引数の個数が一致する必要があります。

サンプル1: 自分で定義した関数を渡す

自分でcountUp関数を定義して、それをarray_map関数に渡すというサンプルを作ってみました。

サンプル1 コードを開く
サンプル1

// x1に1を加算した結果を返す
function countUp($x1)
{
    return $x1 + 1;
}

$data = [1, 2, 3];

// ユーザ定義関数を渡す
$result = array_map('countUp', $data);
var_dump($result);

結果 を開く
結果

array(3) {
   [0]=> int(2)
   [1]=> int(3)
   [2]=> int(4)
}

$dataの要素にそれぞれ+1された結果の配列が$resultに返ってきました。

サンプル2: PHPのビルトイン関数を渡す

strval関数の名前を渡して、配列の要素を文字列にするサンプルを作ってみました。

サンプル2 コードを開く
サンプル2

$data = [1, 2, 3];

// ビルトイン関数(strval)を渡して文字列の配列にする
$result = array_map('strval', $data);
var_dump($result);

結果 を開く
結果

array(3) {
   [0]=> string(1) "1"
   [1]=> string(1) "2"
   [2]=> string(1) "3"
}

先程はint型の配列だったのが、string型の配列になっていることが確認できました。

ビルトイン関数について

ネットで調べてみると組み込み関数標準関数とかもありますが、マニュアルに合わせて内部関数(ビルトイン関数)とします。

内部(ビルトイン)関数 より引用

サンプル3: 配列を2個渡す

なプ

実は最近コレを知った。。。

次は第2引数の可変リストに配列を2つ渡すサンプルを作ってみます。

関数の処理は、$dataに入っている要素を$exp_arrayの要素でそれぞれべき乗するという内容になります。

(ちょっと分かりづらいので、先に下の表(テーブル)を見ていただければどのような動作か分かると思います)

配列要素に対するべき乗の処理を表にすると、こんな感じになります。

$data $exp_array powの結果
1 2 1
2 4 16
3 6 729

サンプル3 コードを開く
サンプル3

$data = [1, 2, 3];
// 要素を乗数する数(1を2乗、2を4乗、3を6乗)
$exp_array = [2, 4, 6];

$result = array_map(
    "pow",
    $data,
    $exp_array
);
print_r($result);

結果 を開く
結果

Array
 (
     [0] => 1
     [1] => 16
     [2] => 729
 )

$dataの配列の要素が、べき乗された結果が確認できました。

コードの説明

pow関数について

pow関数は引数を2個取り、べき乗を返すビルトイン関数です。
単体で使うとこんな感じになります。

pow(2, 4);  // 2の4乗なので16が返ってくる

callableの引数について

マニュアルにあるcallableに渡す関数の引数は、pow関数が取る引数の個数(2個)と、可変リストに渡す配列の個数($data, $exp_arrayの2個)が一致しているので、使用する条件もクリアしています。

おわりに

今回はarray_mapを使って色々とサンプルを作ってみました。

array_mapは処理がちょっと遅いらしいので、たくさん呼び出す時はそのへんを考慮する必要があります。

その時は、forとかforeachを使った方がいいかもしれません。

なプ

array_mapは一時変数を使わないので、つい使いたくなる。。。

ケース・バイ・ケースということで!

それでは、このへんで。
バイナリー!

参考