【PHP入門】配列をコピーする方法まとめ

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回実施しても大した違いはありませんでした)

配列についてもっと詳しく知りたい方へ

配列のさまざまな使い方については、以下の記事にまとめていますので、ぜひ参考にしてくださいね!

まとめ

ここでは、配列をコピーする基本的な方法から、配列のキーのコピー、参照コピーの方法、速度面での比較検証などについて解説しました。

配列を扱った処理は、実際の開発でもよく使用しますので、この機会にぜひ覚えておきましょう。

もし、配列をコピーする方法を忘れてしまったら、この記事を思い出してくださいね!

「プログラミング、右も左もわからない…」という方にオススメ

当プログラミングスクール「侍エンジニア塾」では、これまで6000人以上のエンジニアを輩出してきました。

その経験を通してプログラミング学習に成功する人は、「目的目標が明確でそれに合わせた学習プランがあること」「常に相談できる人がそばにいること」「自己解決能力が身につくこと」この3つが根付いている傾向を発見しました。

侍エンジニア塾は上記3つの成功ポイントを満たすようなサービス設計に磨きをかけております。

cta_under_bnr

「自分のスタイルや目的に合わせて学習を進めたいな」とお考えの方は、ぜひチェックしてみてください。

書いた人

ヤマシタ

システムエンジニアとして10年勤務→フリーランスへ。現在は侍ブログ編集部として、これまでに200記事以上の記事を執筆。
大規模システム開発からWebアプリ開発まで経験あり。最近ではPythonの機械学習に挑戦中。プログラミング初学者に向けてわかりやすく、ためになるコンテンツ作りを心がけています。

おすすめコンテンツ

まずはここから!初心者でも1から学べるプログラミング入門カリキュラム

転職成功で受講料0円!あなたもプログラミングを学んでエンジニアデビュー