PHPの配列内で配列参照を使用するにはどうすればよいですか?
-
08-07-2019 - |
質問
次のことができるようにしたい:
$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
所属していません StackOverflow