[PHP-users 24875] 配列要素に対しての参照を作成した場合の動作について

retasu_ml @ yahoo.co.jp retasu_ml @ yahoo.co.jp
2005年 3月 15日 (火) 15:09:11 JST


はじめまして、緋田と申します。

配列の要素に対しての参照を作成した場合の動作についてご教授頂きたく投稿さ
せて頂きました。

ある配列の要素に対して参照を作成したあと、その配列を他の変数に代入し、元
の配列に対して要素の追加を行うと、代入した先の変数(配列)にも要素が追加
されてしまします。
代入した先の変数(配列)に対しては要素が追加されないことを期待したのです
が、この動作はPHPの仕様なのでしょうか?
PHPマニュアルの配列やリファレンスの説明などを調べてみたのですが、関連
する内容を見つけることができませんでした。
期待通りの動作にする為の方法などはあるのでしょうか?
ご教授頂ければ幸いです。


以下に現象を確認したスクリプトを記載します。
<環境>
    PHP 4.3.1
    OS  Sun Cobalt 6.4

<スクリプト>
<?php
    // 配列の要素の参照を作成した場合
    $tstAry10 = array();
    $tstAry10['Itm01'] = array();
    $refItm01 = & $tstAry10['Itm01'];   // 参照の作成
    $tstAry11 = $tstAry10;              // 配列の代入
    for( $idx=0; $idx<3; ++$idx ){
        $tstAry10['Itm01'][$idx]['SubItm01'] = 'aa';
        $tstAry10['Itm01'][$idx]['SubItm02'] = 'bb';
    }
    print_r( $tstAry10 );
    print_r( $tstAry11 );

    // 配列の要素の参照を作成しない場合
    $tstAry20 = array();
    $tstAry20['Itm01'] = array();
    $tstAry21 = $tstAry20;              // 配列の代入
    for( $idx=0; $idx<3; ++$idx ){
        $tstAry20['Itm01'][$idx]['SubItm01'] = 'aa';
        $tstAry20['Itm01'][$idx]['SubItm02'] = 'bb';
    }
    print_r( $tstAry20 );
    print_r( $tstAry21 );
?>

<実行結果>
Array
(
    [Itm01] => Array
        (
            [0] => Array
                (
                    [SubItm01] => aa
                    [SubItm02] => bb
                )

            [1] => Array
                (
                    [SubItm01] => aa
                    [SubItm02] => bb
                )

            [2] => Array
                (
                    [SubItm01] => aa
                    [SubItm02] => bb
                )

        )

)
Array
(
    [Itm01] => Array
        (
            [0] => Array
                (
                    [SubItm01] => aa
                    [SubItm02] => bb
                )

            [1] => Array
                (
                    [SubItm01] => aa
                    [SubItm02] => bb
                )

            [2] => Array
                (
                    [SubItm01] => aa
                    [SubItm02] => bb
                )

        )

)
Array
(
    [Itm01] => Array
        (
            [0] => Array
                (
                    [SubItm01] => aa
                    [SubItm02] => bb
                )

            [1] => Array
                (
                    [SubItm01] => aa
                    [SubItm02] => bb
                )

            [2] => Array
                (
                    [SubItm01] => aa
                    [SubItm02] => bb
                )

        )

)
Array
(
    [Itm01] => Array
        (
        )

)

------------------------- 以上 -------------------------

__________________________________
Let's Celebrate Together!
Yahoo! JAPAN
http://pr.mail.yahoo.co.jp/so2005/



PHP-users メーリングリストの案内