1

値を関数に渡すときに配列が変更されるという問題が発生しています。

コードを調べたところ、関数内で配列がループされ、参照によって要素が取得されました。

ループの後、配列項目が参照済みとしてマークされているのを見て驚いた。これが何を意味するのかわかりませんが、私の問題の原因であるに違いありません。

ポイントを見るために例を挙げましょう。

<?php
error_reporting(E_ALL);
ini_set('display_errors' , 1);

$a = array( array(0) );
echo '--1--';var_dump($a);
dummy($a);
echo '--4--';var_dump($a);

function dummy($arg) {
    foreach($arg as &$item) {
        $item[0] = 3;
    }    
    dummy2($arg);
echo '--3--';var_dump($arg);
}

function dummy2($arg) {
    foreach($arg as &$item) {
        $item[1]=9;
    }
echo '--2--';var_dump($arg);
}
?>

このコードの後、ポイント3では、$ argには要素が1つしかないが、2つあるため、dummy2関数によって変更されていると思います。

出力は次のとおりです。

--1--array(1) { [0]=> array(1) { [0]=> int(0) } } 
--2--array(1) { [0]=> &array(2) { [0]=> int(3) [1]=> int(9) } } 
--3--array(1) { [0]=> &array(2) { [0]=> int(3) [1]=> int(9) } } 
--4--array(1) { [0]=> array(1) { [0]=> int(0) } }

参照によってループされた後、配列が&arrayとしてマークされるのはなぜですか?どうすればこれを回避できますか?

4

2 に答える 2

2

参照によってキャプチャするループ変数の設定を解除する必要があります。

<?php
error_reporting(E_ALL);
ini_set('display_errors' , 1);

$a = array( array(0) );
echo '--1--';var_dump($a);
dummy($a);
echo '--4--';var_dump($a);

function dummy($arg) {
    foreach($arg as &$item) {
        $item[0] = 3;
    }
    unset($item);
    dummy2($arg);
echo '--3--';var_dump($arg);
}

function dummy2($arg) {
    foreach($arg as &$item) {
        $item[1]=9;
    }
    unset($item);
echo '--2--';var_dump($arg);
}
?>

foreachのドキュメントを参照してください。大きな赤い警告があります。

$ valueと最後の配列要素の参照は、foreachループの後も残ります。unset()で破棄することをお勧めします。

于 2012-06-13T04:42:26.850 に答える
0

key => valueペアを使用して、関数で配列を返します

<?php

    error_reporting(E_ALL);
    ini_set('display_errors' , 1);

    $a = array( array(0) );

    echo '--1--';var_dump($a);

    $a = dummy($a);

    echo '--4--';var_dump($a);

    function dummy($arg) {

        foreach($arg as $key => $value) {

            $arg[$key][0] = 3;
        }

        return dummy2($arg);
    }

    function dummy2($arg) {

        foreach($arg as $key => $value) {

           $arg[$key][1]=9;
        }

        return $arg;
    }
?>

http://codepad.org/f30c6FUj

于 2012-06-12T21:41:37.273 に答える