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でファイルパスorフォルダパスの確認
PHPで画像とか触る際にフォルダのパス、ファイルのパスを 知りたいことがあったの ...
-
-
CentOSでPHPを5.5から5.3にバージョンダウンする方法
事情があってVPSに入れているPHPを5.5系から5.3系にバージョンダウンした ...
-
-
PHP8系で関数の引数が設定しやすくなる名前付き引数について
PHP8系で名前付き引数が導入されたということを最近知った。今までは「第〇引数」 ...
-
-
mp3ファイルのアップロードと再生方法
mp3ファイルをformでアップロードしたかったのと、Webサイト上で再生したか ...
-
-
時間と数字のフォーマット
教わったのでメモ。 ・時間の整形 strtotime() 例) $ymd = ' ...