配列をコピーして別の配列を作る方法は無いか?
そんな質問を頂き知らなかったので検索しました。
けど便利な関数は無さそうですね。
単純に
1 |
$ary2 = $ary1; |
のように書いたんじゃダメでしょうか?
この場合$ayr2の値を変更したりすると$ary1の値はどうなるのか?
実験してみました。
PHPの配列の要素をコピーしたら元の配列の影響は?
配列をコピーして、コピーした配列の値を変更した場合、コピー元の配列の値はどうなるのか?
実験してみました。
1 2 3 4 5 6 |
$ary1 = array("東京", "大阪", "沖縄", "福岡", "大阪"); $ary2 = $ary1; $ary2[4] = "京都"; print_r($ary1); print_r($ary2); |
結果は次のようになりました。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
Array ( [0] => 東京 [1] => 大阪 [2] => 沖縄 [3] => 福岡 [4] => 大阪 ) Array ( [0] => 東京 [1] => 大阪 [2] => 沖縄 [3] => 福岡 [4] => 京都 ) |
1個目の配列がコピー元で、2個目の配列がコピー先ですね。
結果は、コピー元には影響しないですね。
PHPには値渡しと参照渡しというものがあります。
値渡しというのはここで言うコピーです。
コピーした先で値を変更しても、コピー元には影響しません。
参照渡しというのは、メモリに確保した値に対し、住所だけを渡すイメージです。
誰が見るかが違うだけで、参照する値は同じものになります。
この場合コピー先($ary2)で値を変更した場合も、コピー元($ary1)の値が変更されます。
やってみましょう。
1 2 3 4 5 6 |
$ary1 = array("東京", "大阪", "沖縄", "福岡", "大阪"); $ary2 = &$ary1; $ary2[4] = "京都"; print_r($ary1); print_r($ary2); |
2行目の $ary1 の前に & がついています。
これが参照渡しをするときの書き方です。
結果は次のようになります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
Array ( [0] => 東京 [1] => 大阪 [2] => 沖縄 [3] => 福岡 [4] => 京都 ) Array ( [0] => 東京 [1] => 大阪 [2] => 沖縄 [3] => 福岡 [4] => 京都 ) |
1個目の配列がコピー元で、2個目の配列がコピー先ですが、配列のインデックス=4の値がどちらも同じ値になっています。
配列の一部の要素だけコピーはできる?
これに関しても結局便利な関数はありません。
(僕が知らないだけであるかもしれません。そのときは教えてください。)
1 |
$ary1 = array("東京", "大阪", "沖縄", "福岡", "大阪"); |
例えば上のような配列があったときに、大阪だけを抜き出して新しい配列にしたいとします。
その場合は以下のように foreach などを使って新しい配列を作成する感じですね。
1 2 3 4 5 6 7 8 9 |
$ary1 = array("東京", "大阪", "沖縄", "福岡", "大阪"); $arykeys = array_keys($ary1, "大阪"); foreach($arykeys as $val) { $ary2[$val] = $ary1[$val]; } print_r($ary1); print_r($ary2); |
結果は次のようになります。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
Array ( [0] => 東京 [1] => 大阪 [2] => 沖縄 [3] => 福岡 [4] => 大阪 ) Array ( [1] => 大阪 [4] => 大阪 ) |
1個目の配列がコピー元で2個目の配列がコピー先です。
大阪だけ抜き出して新しい配列を作成できました。
どうですか?
まとめ
配列のコピー??って感じでした。
まあ一般的な処理ですね。
使い方によって値渡しと参照渡しがあります。分からなければ値渡しで大丈夫です。
配列の一部を抜き出す処理もよくありますが、ここで紹介した方法以外にもループの中でif文で判定する方法などがあります。
ただ、便利なものはなかなか無いですね。
コメントを残す