勉強したことのメモ

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にて西暦から干支(十二支)を計算し表示する方法

先日MySQLにてSELECT時にdate型のカラムから干支(十二支)を計算し表 ...

PHPのswitch文で「>」「<」等、比較演算子の使用について

switch文は指定の変数が、特定の値もしくは文字列だった場合のみに使うようなも ...

formにGoogle reCAPTCHA v3を組み込み、PHPでスコア判定する方法

だいぶ前にGoogle reCAPTCHA v2をformに組み込むという記事を ...

PHPの日付・時刻関連

使えそうなものをまとめてメモ。 【関数】 ----------- ■date 日 ...

Class 'DOMDocument' not foundエラーの対処方法

PHPでphpQueryというライブラリを利用しようとすると「Fatal err ...