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){
...
}