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でパーミッションの変更
chmodというみたことが無いPHP関数があったのでメモ。 ■参考サイト htt ...
-
PHPで改行を含むデータをCSV化する際に表示崩れを防ぐ方法
PHPで改行を含むデータをCSV化した場合、そのCSVファイルをエクセル等で開く ...
-
PHPからDBX Platformを利用してDropbox内にディレクトリ(フォルダ)を作成する方法
PHPからDBX Platformを利用してDropbox内にディレクトリ(フォ ...
-
CSVファイルを使って郵便番号から住所を抽出する
■ソース <? error_reporting(E_ALL & ~ ...
-
PHPのZipArchive::addFileでファイルが追加できない場合の対応方法
過去記事を参考にPHPにて複数のファイルをzipファイル化後、ダウンロードさせた ...