1
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

PHPのarray_map, foreach, foreachで参照渡しを使う場合の比較

Posted at

配列の各要素に処理を施す方法として、array_mapとforeachがあると思いますが、ふとしたきっかけでforeachで参照渡しを使う方法を知ったのでメモ。
array_mapよりforeachを使った方が高速らしい。

array_map()

$arr = array(1,2,3,4);

$arr_mapped = array_map(function($value){
    //ここでreturnした値が配列の各要素に格納される
    return $value * 2;
},$arr);

dd($arr_mapped);

//array:4 [
//  0 => 2
//  1 => 4
//  2 => 6
//  3 => 8
//]

foreach

$arr = array(1,2,3,4);
//参照ではないため、元の$arrの値は変わらない
//中で別変数を定義してそこに格納する
foreach($arr as $value){
   $arr_mapped[] = $value * 2;
}

dd($arr_mapped);

//array:4 [
//  0 => 2
//  1 => 4
//  2 => 6
//  3 => 8
//]

foreach参照渡し

$arr = array(1,2,3,4);
//$arrの各要素への参照に各要素の2倍を入れる形になる
//元の$arrの値が変わる
foreach($arr as &$value){
    $value = $value * 2;
}
//$valueへの参照が残っているためここで解除しておく
unset($value);

dd($arr);

//array:4 [
//  0 => 2
//  1 => 4
//  2 => 6
//  3 => 8
//]

個人的には参照渡しの場合は最後にunset()しないといけないので、foreach内で変数宣言するやり方が分かりやすくていいかなーと思いました。
でも新しい変数定義するってことはその分メモリ食うってことだから3番目のやり方の方が早いのかな。。
時間があれば計測してみようと思います。

1
3
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?