PHPの配列の要素をコピーする方法って?

配列をコピーして別の配列を作る方法は無いか?

そんな質問を頂き知らなかったので検索しました。

けど便利な関数は無さそうですね。

 

単純に

$ary2 = $ary1;

のように書いたんじゃダメでしょうか?

この場合$ayr2の値を変更したりすると$ary1の値はどうなるのか?

実験してみました。

目次

PHPの配列の要素をコピーしたら元の配列の影響は?

配列をコピーして、コピーした配列の値を変更した場合、コピー元の配列の値はどうなるのか?

実験してみました。

$ary1 = array("東京", "大阪", "沖縄", "福岡", "大阪");
$ary2 = $ary1;
$ary2[4] = "京都";

print_r($ary1);
print_r($ary2);

結果は次のようになりました。

Array
(
    [0] => 東京
    [1] => 大阪
    [2] => 沖縄
    [3] => 福岡
    [4] => 大阪
)
Array
(
    [0] => 東京
    [1] => 大阪
    [2] => 沖縄
    [3] => 福岡
    [4] => 京都
)

1個目の配列がコピー元で、2個目の配列がコピー先ですね。

結果は、コピー元には影響しないですね。

 

PHPには値渡し参照渡しというものがあります。

 

値渡しというのはここで言うコピーです。

コピーした先で値を変更しても、コピー元には影響しません。

 

参照渡しというのは、メモリに確保した値に対し、住所だけを渡すイメージです。

誰が見るかが違うだけで、参照する値は同じものになります。

この場合コピー先($ary2)で値を変更した場合も、コピー元($ary1)の値が変更されます。

やってみましょう。

$ary1 = array("東京", "大阪", "沖縄", "福岡", "大阪");
$ary2 = &$ary1;
$ary2[4] = "京都";

print_r($ary1);
print_r($ary2);

2行目の $ary1 の前に & がついています。

これが参照渡しをするときの書き方です。

結果は次のようになります。

Array
(
    [0] => 東京
    [1] => 大阪
    [2] => 沖縄
    [3] => 福岡
    [4] => 京都
)
Array
(
    [0] => 東京
    [1] => 大阪
    [2] => 沖縄
    [3] => 福岡
    [4] => 京都
)

1個目の配列がコピー元で、2個目の配列がコピー先ですが、配列のインデックス=4の値がどちらも同じ値になっています。

配列の一部の要素だけコピーはできる?

これに関しても結局便利な関数はありません。

(僕が知らないだけであるかもしれません。そのときは教えてください。)

 

$ary1 = array("東京", "大阪", "沖縄", "福岡", "大阪");

例えば上のような配列があったときに、大阪だけを抜き出して新しい配列にしたいとします。

その場合は以下のように foreach などを使って新しい配列を作成する感じですね。

$ary1 = array("東京", "大阪", "沖縄", "福岡", "大阪");
$arykeys = array_keys($ary1, "大阪");

foreach($arykeys as $val) {
	$ary2[$val] = $ary1[$val];
}

print_r($ary1);
print_r($ary2);

結果は次のようになります。

Array
(
    [0] => 東京
    [1] => 大阪
    [2] => 沖縄
    [3] => 福岡
    [4] => 大阪
)
Array
(
    [1] => 大阪
    [4] => 大阪
)

1個目の配列がコピー元で2個目の配列がコピー先です。

大阪だけ抜き出して新しい配列を作成できました。

どうですか?

まとめ

配列のコピー??って感じでした。

まあ一般的な処理ですね。

使い方によって値渡しと参照渡しがあります。分からなければ値渡しで大丈夫です。

配列の一部を抜き出す処理もよくありますが、ここで紹介した方法以外にもループの中でif文で判定する方法などがあります。

ただ、便利なものはなかなか無いですね。

この記事を書いた人

ライターのプロフィールが入ります。このライター情報を入れたくない場合は管理画面の ユーザー > あなたのプロフィールの「プロフィール情報」を未入力にすれば表示されません。逆に「プロフィール情報」を入力することでライター情報を表示できます。

コメント

コメントする

CAPTCHA


目次
閉じる