変数変数指す配列またはネストしたオブジェ
-
19-09-2019 - |
質問
を作成でき、変数変数指を配列に入れ子物?Phpのdocs具体的には言えないポイントSuperGlobalsが明確にしたもので、少なくともこのケースに該当する方は配列です。
ここでは私のみの配列var var.
// Array Example
$arrayTest = array('value0', 'value1');
${arrayVarTest} = 'arrayTest[1]';
// This returns the correct 'value1'
echo $arrayTest[1];
// This returns null
echo ${$arrayVarTest};
ここでは簡単なコードショーうのは、オブジェクトvar var.
${OBJVarVar} = 'classObj->obj';
// This should return the values of $classObj->obj but it will return null
var_dump(${$OBJVarVar});
私を見落とさないような。
解決
配列要素アプローチ:
- エキス配列から文字列に格納します
$arrayName
. - エキス配列インデックス文字列から、大切に保管してくださ
$arrayIndex
. - 構文解析して正しくです。
コード:
$arrayTest = array('value0', 'value1');
$variableArrayElement = 'arrayTest[1]';
$arrayName = substr($variableArrayElement,0,strpos($variableArrayElement,'['));
$arrayIndex = preg_replace('/[^\d\s]/', '',$variableArrayElement);
// This returns the correct 'value1'
echo ${$arrayName}[$arrayIndex];
オブジェクトのプロパティアプローチ:
- 爆発の文字列を含むクラスのプロパティにアクセスしたい、その区切り文字(->).
- 割り当て二つの変数を
$class
や$property
. - 構文解析しており、別々にではなく、全体
var_dump()
コード:
$variableObjectProperty = "classObj->obj";
list($class,$property) = explode("->",$variableObjectProperty);
// This now return the values of $classObj->obj
var_dump(${$class}->{$property});
本当にうまくいきます。
他のヒント
参照することによって割り当てること= &
を使用します:
$arrayTest = array('value0', 'value1');
$arrayVarTest = &$arrayTest[1];
$arrayTest[1] = 'newvalue1'; // to test if it's really passed by reference
print $arrayVarTest;
echo $arrayTest[1];
でVARS名$arrayTest
の配列インデックスを持つ1
であり、そして$arrayTest[1]
ありません。ブラケットは、PHP、「キーワード」です。方法表記と->
オペレータと同じ。ですから、分割する必要があります。
// bla[1]
$arr = 'bla';
$idx = 1;
echo $arr[$idx];
// foo->bar
$obj = 'foo';
$method = 'bar';
echo $obj->$method;
あなたはより多くのPHPコード(eval()
)を評価するような音を何をしたいのか。しかし、覚えている:evalは悪です。 ; - )
いいえ、あなたはそれを行うことはできません。あなたが唯一の変数、オブジェクト名と関数名でそれを行うことができます。
例:
$objvar = 'classObj';
var_dump(${$OBJVarVar}->var);
選択肢が評価()を介して、または前処理を行うことによって行うことができる。
$arrayTest = array('value0', 'value1');
$arrayVarTest = 'arrayTest[1]';
echo eval('return $'.$arrayVarTest.';');
eval('echo $'.$arrayVarTest.';');
あなたが入力する何が起こっているかの非常に確信している場合は、それはあります。
前処理することにより
function varvar($str){
if(strpos($str,'->') !== false){
$parts = explode('->',$str);
global ${$parts[0]};
return $parts[0]->$parts[1];
}elseif(strpos($str,'[') !== false && strpos($str,']') !== false){
$parts = explode('[',$str);
global ${$parts[0]};
$parts[1] = substr($parts[1],0,strlen($parts[1])-1);
return ${$parts[0]}[$parts[1]];
}else{
return false;
}
}
$arrayTest = array('value0', 'value1');
$test = 'arrayTest[1]';
echo varvar($test);
所属していません StackOverflow