スライドショー スライドショー

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

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

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

まとめ

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

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

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

Writer

侍テック編集部

株式会社SAMURAI

侍エンジニア塾は「人生を変えるプログラミング学習」をコンセンプトに、過去多くのフリーランスエンジニアを輩出したプログラミングスクールです。侍テック編集部では技術系コンテンツを中心に有用な情報を発信していきます。

あなたの目的に合わせた
SAMURAI ENGINEERの運営サービス

SAMURAI ENGINEER Pro

未経験でも挫折しないプログラミングスクール

詳細はこちら

SAMURAI ENGINEER Plus

日本最大級のサブスク型オンラインITスクール

詳細はこちら

SAMURAI ENGINEER Freelance

「一人で稼げる」スキルを身につける

詳細はこちら
Close