LoginSignup
0
0

More than 3 years have passed since last update.

PHPの配列は値が変更されるまで複製されないことの確認

Posted at

PHPの配列は擬似基本型

PHPにおいて配列はオブジェクトのような参照型ではなく
数値や文字列と同じように基本型のように振る舞う

しかし内部的には参照型であり
値が変更されることで値が複製されることによって
あたかも基本型であるような振る舞いをしているだけである

確認

まずは大きめの配列を作って
同じ配列を10回別の配列に追加してみる

<?php
echo "first:".(memory_get_usage()>>8)."KB<br/>";
$arr = [];
for($i=0;$i<10000;$i++) {
    $arr[] = $i;
}
$arr2=[];
for($i=0;$i<10;$i++) {
    $arr2[$i] = $arr;
}
echo "now:".(memory_get_usage()>>8)."KB<br/>";
echo "peak:".(memory_get_peak_usage()>>8)."KB";
/*
結果
first:1553KB
now:3620KB
peak:3620KB
*/

別の配列に追加する数を10回から100回に増やしてみる

<?php
echo "first:".(memory_get_usage()>>8)."KB<br/>";
$arr = [];
for($i=0;$i<10000;$i++) {
    $arr[] = $i;
}
$arr2=[];
for($i=0;$i<10;$i++) {
    $arr2[$i] = $arr;
}
echo "now:".(memory_get_usage()>>8)."KB<br/>";
echo "peak:".(memory_get_peak_usage()>>8)."KB";
/*
結果
first:1553KB
now:3649KB
peak:3649KB
*/

10回:3620KB
100回:3649KB

ほとんど変動がない

次に別の配列に値を変更しながら100回追加してみる

echo "first:".(memory_get_usage()>>8)."KB<br/>";
$arr = [];
for($i=0;$i<10000;$i++) {
    $arr[] = $i;
}
$arr2=[];
for($i=0;$i<100;$i++) {
    $arr2[$i] = $arr;
    $arr2[$i][0]++;
}
echo "now:".(memory_get_usage()>>8)."KB<br/>";
echo "peak:".(memory_get_peak_usage()>>8)."KB";
/*
結果
first:1554KB
now:210072KB
peak:210072KB
*/

変更せずに100回:3649KB
変更しながら100回:210072KB

劇的にメモリ使用量が増えた

つまり何?

PHPのメモリの節約のためには無用に配列の値を変更することを避けるべきである
値を加工するなら取り出してからやったほうが良い

function hoge($huge_array){
  $huge_array['value'] = some_modify($huge_array['value']);
}



function hoge($huge_array){
  $value = some_modify($huge_array['value']);
}

PHPで配列が複製されるのを防ぐために参照変数を用いることは無意味である
値を変更しさえしなければ配列は複製されない

function hoge(&$array){
 ...
}



function hoge($array){
 ...
}
0
0
0

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
0
0