PHPでは、配列を使用してさまざまな処理が可能です。
この記事では、
・配列をコピーする基本的な方法
・配列のキーをコピーする方法
という基本的な内容から、
・配列を参照コピーする方法
・通常コピーと参照コピーの速度検証
などの応用的な使い方に関しても解説していきます。
今回はそんな配列をコピーする方法について、わかりやすく解説します!
配列をコピーする
配列全体コピーする場合は、変数を代入するときのように代入演算子「=」を使用すれば、以下のように簡単にコピーできます。
<?php $fruits1 = ['apple', 'orange', 'melon', 'banana', 'pineapple']; $fruits2 = $fruits1; foreach($fruits2 as $value){ echo $value; echo '<br>'; } ?>
実行結果 apple orange melon banana pineapple
実行結果のとおり、代入演算子「=」を使用すれば、$fruits2に$fruits1の配列が丸ごとコピーされます。
foreachを使用する方法
foreachを使用して、ループの中で配列の要素を1つずつコピーする場合は、[](角括弧)を使用すれば簡単にコピーできます。
<?php $fruits1 = ['apple', 'orange', 'melon', 'banana', 'pineapple']; foreach($fruits1 as $value){ $fruits2[] = $value; } foreach($fruits2 as $value){ echo $value; echo '<br>'; } ?>
実行結果 apple orange melon banana pineapple
配列のさまざまなループ処理については、以下の記事で詳しく解説しています!
配列を参照コピーする
値を参照コピーする場合は、コピー元の配列に&(アンパサンド)を付加してコピーします。これは変数を参照コピーするときも同様です。
$コピー元配列 = &$コピー先配列;
なお、参照コピーなのでコピー元の値が変更された場合は、コピー先の値も変更されますので注意が必要です。
特にコピー先の配列の値を変えられたくない場合は、通常の演算子”=“を使用したコピーを実施してください。
以下に配列を参照コピーする方法を記述します。
<?php $fruits1 = ['apple', 'orange', 'melon', 'banana', 'pineapple']; $fruits2 = &$fruits1; $fruits2[0] = 'mango'; foreach($fruits1 as $value){ echo $value; echo '<br>'; } ?>
実行結果 mango orange melon banana pineapple
コピー元配列を$fruits1、コピー先配列に$fruits2に参照コピーして、コピー先配列の値を変更すると実行結果のとおり、コピー元にも影響があることがわかります。
配列のキーをコピーする
連想配列から配列のキーのみをコピーしたい場合は、以下のようにループでキーを1つずつ取得して、別の配列に格納すれば簡単にコピーできます。
<?php $fruits = [0=>'apple', 1=>'orange', 2=>'melon', 3=>'banana', 4=>'pineapple']; foreach($fruits as $key => $value){ $fruits_key[] = $key; } foreach($fruits_key as $value){ echo $value; echo '<br>'; } ?>
実行結果 0 1 2 3 4
キーの配列と値の配列を元にひとつの連想配列を作成する場合は、array_combine関数を使用します。
array_combine関数については、以下の記事で詳しく解説しています!
速度面
配列の操作は、システムのさまざまな処理で使用されます。
しかし、よく使うからこそ処理パフォーマンスも気になるところです。
ここでは、配列の通常コピーと参照コピーを実施したときに、どちらがパフォーマンス的に優れているか?速度を比較してみました。
比較にはmicrotime関数を使用し、それぞれループの中で100万回配列をコピーしたときの速度を比較しています。
<?php $fruits1 = ['apple', 'orange', 'melon', 'banana', 'pineapple']; $copy_start1 = microtime(true); for ($i = 0 ; $i < 1000000; $i++){ $fruits2 = $fruits1; } $copy_end1 = microtime(true) - $copy_start1; echo '通常コピー : '.$copy_end1 .'秒'; echo '<br>'; $copy_start2 = microtime(true); for ($i = 0 ; $i < 1000000; $i++){ $fruits2 = &$fruits1; } $copy_end2 = microtime(true) - $copy_start2; echo '参照コピー : '.$copy_end2 .'秒'; ?>
実行結果 <1回目> 通常コピー : 0.0697059631348秒 参照コピー : 0.0731921195984秒 <2回目> 通常コピー : 0.0685529708862秒 参照コピー : 0.0715301036835秒 <3回目> 通常コピー : 0.0665168762207秒 参照コピー : 0.0719561576843秒
実行結果のとおり、通常コピーも参照コピーも速度的にはそれほど変わりないことが分かりました。(3回実施しても大した違いはありませんでした)
配列についてもっと詳しく知りたい方へ
配列のさまざまな使い方については、以下の記事にまとめていますので、ぜひ参考にしてくださいね!
まとめ
ここでは、配列をコピーする基本的な方法から、配列のキーのコピー、参照コピーの方法、速度面での比較検証などについて解説しました。
配列を扱った処理は、実際の開発でもよく使用しますので、この機会にぜひ覚えておきましょう。
もし、配列をコピーする方法を忘れてしまったら、この記事を思い出してくださいね!