PHPのarray_map / array_walk関数について
他社が作成されたPHPのソースコードを拝見しているとarray_mapという見慣れない関数が使われていた。調べてみると配列を走査し同じ処理を行うという関数みたい。また、似た関数でarray_walkというものもあった。以下に詳細をメモ。
目次
リファレンス
array_map
https://www.php.net/manual/ja/function.array-map.php
array_walk
https://www.php.net/manual/ja/function.array-walk.php
比較
通常の使い方
$price = array(1000, 5000, 300, 2000); $price = array_map(function($val){ return $val * 1.1; }, $price); var_dump($price); //array(4) { [0]=> float(1100) [1]=> float(5500) [2]=> float(330) [3]=> float(2200) } $price = array_walk($price, function($val, $key){ return $val * 1.1; }); var_dump($price); //array(4) { [0]=> float(1100) [1]=> float(5500) [2]=> float(330) [3]=> float(2200) }
上記ソースコードだと同じ結果が出力される筈。違いとしては各関数の引数位置が異なる(逆になる)という点とarray_walkはコールバック関数の引数にキーを指定できる点。
参照渡しをする場合
$price = array(1000, 5000, 300, 2000); array_map(function( &$val ){ $val = $val * 1.1; }, $price); var_dump($price); //array(4) { [0]=> int(1000) [1]=> int(5000) [2]=> int(300) [3]=> int(2000) } array_walk($price, function( &$val, $key ){ $val = $val * 1.1; }); var_dump($price); //array(4) { [0]=> float(1100) [1]=> float(5500) [2]=> float(330) [3]=> float(2200) }
array_walkは参照渡しすると元の配列の値を書き換えられる。
使いどころ
配列のソート
こちらの参考サイトで見かけた以下のような配列のソート。
$data = array( array('id' => 1, 'ymd' => '2024-12-01'), array('id' => 2, 'ymd' => '2024-01-01'), array('id' => 3, 'ymd' => '2024-06-01'), array('id' => 4, 'ymd' => '2024-03-01'), array('id' => 5, 'ymd' => '2024-09-01'), ); array_multisort(array_map('strtotime', array_column($data,'ymd')), SORT_DESC, $data); var_dump($data); /* ymdでソートされる array(5) { [0]=> array(2) { ["id"]=> int(1) ["ymd"]=> string(10) "2024-12-01" } [1]=> array(2) { ["id"]=> int(5) ["ymd"]=> string(10) "2024-09-01" } [2]=> array(2) { ["id"]=> int(3) ["ymd"]=> string(10) "2024-06-01" } [3]=> array(2) { ["id"]=> int(4) ["ymd"]=> string(10) "2024-03-01" } [4]=> array(2) { ["id"]=> int(2) ["ymd"]=> string(10) "2024-01-01" } } */
$dataをymd順にソートできる。
戻り値が不要な関数をまとめて実行
Cronが使えないサーバで何らかのプログラムをスケジュール実行したい場合、Cron不可側のサーバに実行用ファイルを設置しておき、Cron可のサーバからfile_get_contentsとかで当該ファイルにアクセスしたりする。このような場合以下のような形でまとめてfile_get_contentsを実行できる。
$urls = array( 'https://test.com/?param=123', 'https://test.com/?param=456', 'https://test.com/?param=789', ); array_map('file_get_contents', $urls);
その他
foreachの方が速いらしい
こちらのサイトによると実行速度はforeachが一番速く、array_walkが一番遅いとのこと。そのため無理にarray_map / array_walk関数を使う必要は無さそう。
map関数の名前の由来
mapと言われると地図を思い浮かべるが、処理内容的に名前と合っていないような気がしたため由来を調べてみたところ、こちらのサイトによると写像という意味っぽい。以下引用で何となくイメージが掴めた。
つまり、一方の集合(map関数に与える配列)に変換を適用し、他方の集合(map関数の戻り値)の各要素に結びつける対応を行う、というイメージです。
関連記事
-
-
PHPで数字のプラスとマイナスを反転させる方法
PHPのプログラム内で数値のプラスとマイナスを反転させたい。以下に対応方法をメモ ...
-
-
GoogleスプレッドシートとPHPを連携させデータを取得・追記する方法
GoogleスプレッドシートとPHPプログラムを連携させたいという案件をたまに見 ...
-
-
PHPでエラーメッセージを見やすくするwhoopsの利用方法
PHPのエラーメッセージが見づらい。これはこういうもの、と諦めていたがCodei ...
-
-
HTML / CSSで作成したコンテンツをPDFファイルで出力する方法(TCPDF)
HTML / CSSで作成したコンテンツをPDFファイルで出力させたい。以前mp ...
-
-
PHP Qr Codeライブラリを使用してQRコードを生成する方法
PHPでQRコードを生成したい。大分前にGoogle Chart APIを用いて ...