質問

次のことができるようにしたい:

$normal_array       = array();
$array_of_arrayrefs = array( &$normal_array );

// Here I want to access the $normal_array reference **as a reference**,
// but that doesn't work obviously. How to do it?
end( $array_of_arrayrefs )["one"] = 1; // choking on this one

print $normal_array["one"]; // should output 1

よろしく

/ R

役に立ちましたか?

解決

end()は、最後の値の参照ではなく、最後の値自体を返します。回避策は次のとおりです。

$normal_array       = array();
$array_of_arrayrefs = array( &$normal_array );

$refArray = &end_byref( $array_of_arrayrefs );
$refArray["one"] = 1;

print $normal_array["one"]; // should output 1

function &end_byref( &$array ) {
    $lastKey = end(array_keys($array));
    end($array);
    return $array[$lastKey];
}

他のヒント

ここにいくつかのアプローチがありますが、どちらも特に満足できるものではありません。 より良い方法があると確信しています。

<?php
$normal_array       = array();
$array_of_arrayrefs = array( "blah", &$normal_array );

foreach ($array_of_arrayrefs as &$v);
$v["one"] = 1;

echo $normal_array["one"];  //prints 1
?>


<?php
$normal_array       = array();
$array_of_arrayrefs = array( "blah", &$normal_array );

$lastIndex = @end(array_keys($array_of_arrayrefs)); //raises E_STRICT because end() expects referable.
$array_of_arrayrefs[$lastIndex]["one"] = 1;

echo $normal_array["one"];  //prints 1
?>

最初の段階で参照渡しをしてはいけません。状態が変更される場所を確認するのが難しくなるため、一般的にそうすることは悪い習慣と考えられています。

参照が高速であるというのは非常によくある誤解です。これは事実ではありません-実際、それらは少し遅いですが、それは実際には問題ではないほど小さい量です。 PHPにはcopy-on-writeと呼ばれるシステムがあります。つまり、変数に書き込む前に、変数は実際にはコピーされません。

参照が本当に必要な場所はPHP4のみで、そうしないとオブジェクトが複製されます。これはPHP5では必要ありません。

関数end()は値を返すだけではありません。また、配列の内部ポインターを移動します。次に、key()を使用してインデックスを取得できます。その後、割り当てに通常の配列アクセスを使用できます。

$normal_array       = array();
$array_of_arrayrefs = array( &$normal_array );

end($array_of_arrayrefs);
$array_of_arrayrefs[ key($array_of_arrayrefs) ]["one"] = 1;

print $normal_array["one"];

行:

  

end($ array_of_arrayrefs)[&quot; one&quot;] = 1; //これを窒息させます

解析エラーをスローします:

  

解析エラー:構文エラー、65行目の/file.phpに予期しない「[」

error_reporting および display_error がアクティブになっていることを確認してください。

あなたが何をしたいのかわかりませんが、これは動作します:

$normal_array       = array();
$array_of_arrayrefs = array( &$normal_array );
// Here I want to access the $normal_array reference **as a reference**,
// but that doesn't work obviously. How to do it?
$array_of_arrayrefs[0]["one"] = 1;
//end($array_of_arrayrefs )["one"] = 1; // choking on this one
print $normal_array["one"]; // should output 1
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top