2011-10-21 4 views
2

誰もが$ {'varName'}を使ってPHPの変数にアクセスできることを知っています。しかし、変数を取得したり設定したりする必要があるときは、配列の一部ですが、なぜ動作しませんか?このコードがあるとします。php ARRAY変数に動的にrefferするには?

<?php 
    $myArray = array(...); 
    $myVarName = "myArray['my1']['my11']['my111']"; 
    ${$myVarName} = "new value"; 
?> 

これは機能しませんか? 私は何度も何度もそれをテストしました。それは動作していません。 これを行う方法はありますか?

+2

これらは可変変数と呼ばれます。あなたは決してそれらを使うべきではありません。あなたが解決しようとしている根本的な問題は何ですか? –

+0

私はフレームワークを使用していない人のためにプロジェクトを行い、自分自身を助けるためにいくつかの機能を構築する必要があります。そのために、カテゴリのリストを取得し、無制限レベルのツリー(親 - >子)を作成する特定の関数を作成しようとします。私はいくつかのポイント(魔法使いからの再帰関数では、私は順序配列でいくつかの配列変数を設定する必要があります)になる。 – Michael

+0

..私は設定する必要がある配列varへのパスを構築する必要があります。 – Michael

答えて

11

${$var}のような動的変数を使用しないことをおすすめします。 あなたが望むのは、キーのパスに従って多次元連想配列を変更することです。

<?php 
$myArray = array(...); // multi-dimensional array 
$myVarPath = array('my1', 'my11', 'my111'); 
setValueFromPath($myArray, $myVarPath); 

function getValueFromPath($arr, $path) 
{ 
    // todo: add checks on $path 
    $dest = $arr; 
    $finalKey = array_pop($path); 
    foreach ($path as $key) { 
     $dest = $dest[$key]; 
    } 
    return $dest[$finalKey]; 
} 

function setValueFromPath(&$arr, $path, $value) 
{ 
    // we need references as we will modify the first parameter 
    $dest = &$arr; 
    $finalKey = array_pop($path); 
    foreach ($path as $key) { 
     $dest = &$dest[$key]; 
    } 
    $dest[$finalKey] = $value; 
} 

これは簡単な手順の例です。階層配列を配置し、この関数をクラス内に配置することができます。

+0

ありがとう、Mytskine!それは私が必要なものです! [+10](評判が1つあると投票できません) – Michael

+0

@ Macovei.Radu喜んで助けてくれます。シンプルで興味深い質問でした(私はPHPでリファレンスを使用することはほとんどありません)。答えの左側にあるチェックマークをクリックすることで、回答を受け入れることができます(詳細はSO FAQを参照してください)。 –

2

これは機能しませんか? $ { 'VARNAME'}:

誰もがあなたがこれを使用してPHPの変数にアクセスできることを知っています。

はい。しかし誰もがそれが不自由であることを知っている。

どのように動的にphp配列変数を参照するのですか?

('my1','my11','my111')の配列を持つ配列は、単なるループを使用して任意の配列メンバーを参照できます。

+0

私は動的変数が不足していることに同意します。しかし、私はあなたが間違っていると信じています。キーの経路に従って多次元連想配列を変更することはそれほど明白ではない。それは少なくとも参照を必要としませんか? –

+0

@Mytskineまず、あなたが本当にそれを必要とするかどうか尋ねる。 –

+0

@Col。 Shrapnel簡単なクエリ結果に基づいてツリー(親 - >子)配列を作成するための提案がありますか?これは私がやろうとしていることです。私が働いている仕事のために私を雇った人々は、フレームワークを使用していないので、私はこの種のツールが提供する特権を持っていません。 – Michael

0

あなたはでしたこれは何かをしますが、それは本当に悪い考えです。 Sorry Col.;)

<?php 
$mA = array(); 
$mVN = "mA['m1']['m2']['m3']"; 
eval('$'. $mVN . ' = "new value";'); 
print_r($mA); 
?> 
関連する問題