【PHP】これで分かる関数! – 配列のコピー –

PHP

更新履歴

更新日更新者更新内容
2021/8/13JJI・”はじめに”の段落の内容を修正
2021/8/14JJI・”配列のコピー”の段落に、配列コピー方法の説明を追記
2021/8/20JJI・サンプルプログラムの実行結果に画面の画像を追加

はじめに

配列を表示するため、次の共通関数を使用している場合があります。

配列のコピー

配列のコピーは関数を使用せず、式の代入(=)で簡単にできます。
配列のコピー方法には次の2種類があります。

1.値渡し
値渡しの場合、次のようなコードで書きます。
値渡しの場合、コピー元の配列とコピー先の配列は別々のものになるため、コピー元の配列を変更してもコピー先の配列には影響は与えません。

$ary2 = $ary1;

2.参照渡し
1.値渡し
参照渡しの場合、次のようなコードで書きます。
参照渡しの場合、コピー元の配列とコピー先の配列は同じものになるため、コピー元の配列を変更した場合、コピー先の配列も同じように変更されます。

$ary2 = &$ary1;

それぞれの方法について配列と連想配列でコピーするサンプルプログラムを紹介します。

配列

配列をコピーするサンプルプログラムです。

サンプルプログラム1

値渡しのサンプルプログラムです。

<?php
    // 引数の値への厳密な型付け
    declare(strict_types = 1);
    // ライブラリの読み込み
    require_once "lib/sample_lib_02_03.php";

    echo "ファイル名:sample02_03_27.php<br>\n";
    echo "【PHP】関数<br>\n";
    echo "配列のコピー<br>\n";

    // 1次元配列
    $ary1 = [
        "山田", "太郎", 35, "男性"
    ];

    // 値渡しのコピー
    echo "値渡しのコピー<br>\n";
    $ary2 = $ary1;

    // 配列の出力
    echo "コピー元の配列<br>\n";
    echo_array1($ary1);

    echo "コピー先の配列<br>\n";
    echo_array1($ary2);

    echo "コピー元の変更<br>\n";
    $ary1[1] = "次郎";

    // 配列の出力
    echo "変更後のコピー元の配列<br>\n";
    echo_array1($ary1);

    echo "変更後のコピー先の配列、コピー元の変更は影響なし<br>\n";
    echo_array1($ary2);
?>

実行結果です。

・画面

・HTML

ファイル名:sample02_03_27.php<br>
【PHP】関数<br>
配列のコピー<br>
値渡しのコピー<br>
コピー元の配列<br>
[0]:山田: [1]:太郎: [2]:35: [3]:男性:<br><br>
コピー先の配列<br>
[0]:山田: [1]:太郎: [2]:35: [3]:男性:<br><br>
コピー元の変更<br>
変更後のコピー元の配列<br>
[0]:山田: [1]:次郎: [2]:35: [3]:男性:<br><br>
変更後のコピー先の配列、コピー元の変更は影響なし<br>
[0]:山田: [1]:太郎: [2]:35: [3]:男性:<br><br>

サンプルプログラム2

参照渡しのサンプルプログラムです。
参照渡しのコピーの場合、コピー元を変更した場合、コピー先も同じように変更されます。

<?php
    // 引数の値への厳密な型付け
    declare(strict_types = 1);
    // ライブラリの読み込み
    require_once "lib/sample_lib_02_03.php";

    echo "ファイル名:sample02_03_26.php<br>\n";
    echo "【PHP】関数<br>\n";
    echo "配列のコピー<br>\n";

    // 1次元配列
    $ary1 = [
        "山田", "太郎", 35, "男性"
    ];

    // 参照渡しのコピー
    echo "参照渡しのコピー<br>\n";
    $ary2 = &$ary1;

    // 配列の出力
    echo "コピー元の配列<br>\n";
    echo_array1($ary1);

    echo "コピー先の配列<br>\n";
    echo_array1($ary2);

    echo "コピー元の変更<br>\n";
    $ary1[1] = "次郎";

    // 配列の出力
    echo "変更後のコピー元の配列<br>\n";
    echo_array1($ary1);

    echo "変更後のコピー先の配列、コピー元の変更が反映される<br>\n";
    echo_array1($ary2);
?>

実行結果です。

・画面

・HTML

ファイル名:sample02_03_26.php<br>
【PHP】関数<br>
配列のコピー<br>
参照渡しのコピー<br>
コピー元の配列<br>
[0]:山田: [1]:太郎: [2]:35: [3]:男性:<br><br>
コピー先の配列<br>
[0]:山田: [1]:太郎: [2]:35: [3]:男性:<br><br>
コピー元の変更<br>
変更後のコピー元の配列<br>
[0]:山田: [1]:次郎: [2]:35: [3]:男性:<br><br>
変更後のコピー先の配列、コピー元の変更は影響なし<br>
[0]:山田: [1]:次郎: [2]:35: [3]:男性:<br><br>

連想配列

連想配列をコピーするサンプルプログラムです。
配列と同様のコードでコピーができます。

サンプルプログラム1

値渡しのサンプルプログラムです。

<?php
    // 引数の値への厳密な型付け
    declare(strict_types = 1);
    // ライブラリの読み込み
    require_once "lib/sample_lib_02_03.php";

    echo "ファイル名:sample02_03_27.php<br>\n";
    echo "【PHP】関数<br>\n";
    echo "連想配列のコピー<br>\n";

    // 1次元配列
    $ary1 = [
        "first_name" => "山田", "second_name" => "太郎", "age" => 35, "seibetsu" => "男性"
    ];

    // 値渡しのコピー
    echo "値渡しのコピー<br>\n";
    $ary2 = $ary1;

    // 配列の出力
    echo "コピー元の配列<br>\n";
    echo_array1($ary1);

    echo "コピー先の配列<br>\n";
    echo_array1($ary2);

    echo "コピー元の変更<br>\n";
    $ary1["second_name"] = "次郎";

    // 配列の出力
    echo "変更後のコピー元の配列<br>\n";
    echo_array1($ary1);

    echo "変更後のコピー先の配列、コピー元の変更は影響なし<br>\n";
    echo_array1($ary2);
?>

実行結果です。

・画面

・HTML

ファイル名:sample02_03_27.php<br>
【PHP】関数<br>
連想配列のコピー<br>
値渡しのコピー<br>
コピー元の配列<br>
[first_name]:山田: [second_name]:太郎: [age]:35: [seibetsu]:男性:<br><br>
コピー先の配列<br>
[first_name]:山田: [second_name]:太郎: [age]:35: [seibetsu]:男性:<br><br>
コピー元の変更<br>
変更後のコピー元の配列<br>
[first_name]:山田: [second_name]:次郎: [age]:35: [seibetsu]:男性:<br><br>
変更後のコピー先の配列、コピー元の変更は影響なし<br>
[first_name]:山田: [second_name]:太郎: [age]:35: [seibetsu]:男性:<br><br>

サンプルプログラム2

参照渡しのサンプルプログラムです。

<?php
    // 引数の値への厳密な型付け
    declare(strict_types = 1);
    // ライブラリの読み込み
    require_once "lib/sample_lib_02_03.php";

    echo "ファイル名:sample02_03_28.php<br>\n";
    echo "【PHP】関数<br>\n";
    echo "連想配列のコピー<br>\n";

    // 1次元配列
    $ary1 = [
        "first_name" => "山田", "second_name" => "太郎", "age" => 35, "seibetsu" => "男性"
    ];

    // 参照渡しのコピー
    echo "参照渡しのコピー<br>\n";
    $ary2 = &$ary1;

    // 配列の出力
    echo "コピー元の配列<br>\n";
    echo_array1($ary1);

    echo "コピー先の配列<br>\n";
    echo_array1($ary2);

    echo "コピー元の変更<br>\n";
    $ary1["second_name"] = "次郎";

    // 配列の出力
    echo "変更後のコピー元の配列<br>\n";
    echo_array1($ary1);

    echo "変更後のコピー先の配列、コピー元の変更が反映される<br>\n";
    echo_array1($ary2);
?>

実行結果です。

・画面

・HTML

ファイル名:sample02_03_28.php<br>
【PHP】関数<br>
連想配列のコピー<br>
参照渡しのコピー<br>
コピー元の配列<br>
[first_name]:山田: [second_name]:太郎: [age]:35: [seibetsu]:男性:<br><br>
コピー先の配列<br>
[first_name]:山田: [second_name]:太郎: [age]:35: [seibetsu]:男性:<br><br>
コピー元の変更<br>
変更後のコピー元の配列<br>
[first_name]:山田: [second_name]:次郎: [age]:35: [seibetsu]:男性:<br><br>
変更後のコピー先の配列、コピー元の変更が反映される<br>
[first_name]:山田: [second_name]:次郎: [age]:35: [seibetsu]:男性:<br><br>

コメント