3

配列またはネストされたオブジェクトを指す可変変数を作成することは可能ですか? PHPのドキュメントでは、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});    

ここで明らかな何かが欠けていますか?

4

5 に答える 5

5

配列要素アプローチ:

  • 文字列から配列名を抽出し、 に格納し$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これら 2 つの変数をおよびに割り当てます$property
  • 全体ではなく個別に解析するvar_dump()

コード:

$variableObjectProperty = "classObj->obj";
list($class,$property)  = explode("->",$variableObjectProperty);

// This now return the values of $classObj->obj
var_dump(${$class}->{$property});    

できます!

于 2010-01-10T09:30:06.057 に答える
2

= &参照による代入に使用:

 $arrayTest = array('value0', 'value1');
 $arrayVarTest = &$arrayTest[1];

 $arrayTest[1] = 'newvalue1'; // to test if it's really passed by reference

 print $arrayVarTest;
于 2010-01-10T09:17:22.140 に答える
0

echo $arrayTest[1];vars name$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 は悪です。;-)

于 2010-01-10T09:10:22.807 に答える
0

多くのネストされたレベルへの動的なアプローチがあります。

$attrs = ['level1', 'levelt', 'level3',...];
$finalAttr = $myObject;
foreach ($attrs as $attr) {
    $finalAttr = $finalAttr->$attr;
}
return $finalAttr;
于 2020-01-14T13:36:03.357 に答える
0

いいえ、それはできません。これは、変数、オブジェクト、および関数名でのみ行うことができます。

例:

 $objvar = 'classObj';
 var_dump(${$OBJVarVar}->var);

別の方法として、eval() を使用するか、前処理を行うことができます。

$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);
于 2010-01-10T09:16:06.450 に答える