[PHP] array_mapのサンプルを作ってみる
![アイキャッチ画像](/img/article/php/func/array-map/00-eye-catch.png)
Nプログラマ(@Nprog128)です。
今回は、array_mapの使って色々とサンプルを作ってみます。
基本
1array_map ( callable $callback , array $array1 [, array $… ] ) : array
最近知ったのですが、第2引数以降は可変リストなんですね。
配列は1コしか渡せないと思いこんでいました。
基本コード
基本 コードを開く
1<?php
2
3$numbers = [10, 20, 30];
4
5array_map(
6 function ($value) {
7 echo $value, "\n";
8 },
9 $numbers
10);
第1引数には、配列に対する処理を行う関数を渡します。
第2引数には、第1引数の関数に渡す配列を渡します。
配列の個数は任意の数を渡せますが、任意の個数と、第1引数の関数が取る引数の個数が一致する必要があります。
サンプル1: 自分で定義した関数を渡す
自分でcountUp関数を定義して、それをarray_map関数に渡すというサンプルを作ってみました。
サンプル1 コードを開く
1// x1に1を加算した結果を返す
2function countUp($x1)
3{
4 return $x1 + 1;
5}
6
7$data = [1, 2, 3];
8
9// ユーザ定義関数を渡す
10$result = array_map('countUp', $data);
11var_dump($result);
結果 を開く
1array(3) {
2 [0]=> int(2)
3 [1]=> int(3)
4 [2]=> int(4)
5}
$dataの要素にそれぞれ+1された結果の配列が$resultに返ってきました。
サンプル2: PHPのビルトイン関数を渡す
strval関数の名前を渡して、配列の要素を文字列にするサンプルを作ってみました。
サンプル2 コードを開く
1$data = [1, 2, 3];
2
3// ビルトイン関数(strval)を渡して文字列の配列にする
4$result = array_map('strval', $data);
5var_dump($result);
結果 を開く
1array(3) {
2 [0]=> string(1) "1"
3 [1]=> string(1) "2"
4 [2]=> string(1) "3"
5}
先程はint型の配列だったのが、string型の配列になっていることが確認できました。
ネットで調べてみると組み込み関数や標準関数とかもありますが、マニュアルに合わせて内部関数(ビルトイン関数)とします。
内部(ビルトイン)関数 より引用
サンプル3: 配列を2個渡す
次は第2引数の可変リストに配列を2つ渡すサンプルを作ってみます。
関数の処理は、$dataに入っている要素を$exp_arrayの要素でそれぞれべき乗するという内容になります。
1(ちょっと分かりづらいので、先に下の表(テーブル)を見ていただければどのような動作か分かると思います)
配列要素に対するべき乗の処理を表にすると、こんな感じになります。
$data | $exp_array | powの結果 |
---|---|---|
1 | 2 | 1 |
2 | 4 | 16 |
3 | 6 | 729 |
サンプル3 コードを開く
1$data = [1, 2, 3];
2// 要素を乗数する数(1を2乗、2を4乗、3を6乗)
3$exp_array = [2, 4, 6];
4
5$result = array_map(
6 "pow",
7 $data,
8 $exp_array
9);
10print_r($result);
結果 を開く
1Array
2 (
3 [0] => 1
4 [1] => 16
5 [2] => 729
6 )
$dataの配列の要素が、べき乗された結果が確認できました。
コードの説明
pow関数について
pow関数は引数を2個取り、べき乗を返すビルトイン関数です。単体で使うとこんな感じになります。
1pow(2, 4); // 2の4乗なので16が返ってくる
callableの引数について
マニュアルにある callableに渡す関数の引数は、pow関数が取る引数の個数(2個)と、可変リストに渡す配列の個数($data, $exp_arrayの2個)が一致しているので、使用する条件もクリアしています。おわりに
今回はarray_mapを使って色々とサンプルを作ってみました。
array_mapは処理がちょっと遅いらしいので、たくさん呼び出す時はそのへんを考慮する必要があります。
その時は、forとかforeachを使った方がいいかもしれません。
ケース・バイ・ケースということで!
それでは、このへんで。
バイナリー!