2

だから私はこの関数を持っていて、渡された配列への特定のポイントへの参照を返します。 unset を呼び出して、配列/参照から結果を削除したいのですが、 unset を呼び出すと参照が削除されるだけです。元の配列のデータではありません。何かご意見は?

4

3 に答える 3

4

参照を に設定するnullと、参照 (およびその他の参照) がリンクされているデータが破棄されます。

詳細については、マニュアルの参照の設定解除を参照してください。基本的に、次のことを行います(コメントから取得):

$a = 1;
$b =& $a;
$c =& $b;  //$a, $b, $c reference the same content '1'

$b = null; //All variables $a, $b or $c are unset

あなたの場合、次のようになります。

$a =& getArrayReference($whatever);
$a = null;

編集

誤解を解くために、配列参照の設定を解除すると、次のようになります。

$arr = array('x','y','z');

$x =& $arr[1];
unset($x);
print_r($arr);
//gives Array ( [0] => x [1] => y [2] => z )

$x =& $arr[1];
$x = null;
print_r($arr);
//gives Array ( [0] => x [1] => [2] => z ) 

を使用した最初の例では、2 番目の配列インデックスの内容が削除されていませんがunset()、参照を設定する 2 番目の例ではこれが行われていることに注意してくださいnull

注:配列インデックスも設定解除する必要がある場合は、設定を解除するかどうかについては少しわかりませんが、値の代わりに配列のキーを参照する方法を見つける必要があります。関数の戻り値を変更することによって可能性があります。

于 2009-12-30T00:12:46.307 に答える
1

参照の設定を解除しても、参照されている変数の設定が解除されないことが予想される動作です。1 つの解決策は、値の代わりにキーを返し、それを使用して元の値を設定解除することです。

于 2009-12-30T00:14:53.540 に答える
0

unset参照時の動作は設計によるものであることに注意してください。代わりに、削除する要素のインデックスを返すか、配列がフラットでない場合はインデックスの配列を返すことができます。

たとえば、次の関数を使用できます。

function delItem(&$array, $indices) {
    $tmp =& $array;
    for ($i=0; $i < count($indices)-1; ++$i) {
        $key = $indices[$i];
        if (isset($tmp[$key])) {
            $tmp =& $tmp[$key];
        } else {
            return array_slice($indices, 0, $i+1);
        }
    }
    unset($tmp[$indices[$i]]);
    return False;
}

または、例外を希望する場合は、

function delItem(&$array, $indices) {
    $tmp =& $array;
    while (count($indices) > 1) {
        $i = array_shift($indices);
        if (isset($tmp[$i])) {
            $tmp =& $tmp[$i];
        } else {
            throw new RangeException("Index '$i' doesn't exist in array.");
        }
    }
    unset($tmp[$indices[0]]);
}
于 2009-12-30T00:13:19.643 に答える