勉強したことのメモ

Webエンジニア / プログラマが勉強したことのメモ。

PHPのarray_map / array_walk関数について

  PHP

他社が作成された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で数字のプラスとマイナスを反転させる方法

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を用いて ...