2010-12-14 1 views
0

以下のコードは、キーを既存の配列$options_poolに動的に連結します。最終的な形式は次のようになります:$options_pool[ $base_key ][ $first_key ][ $second_key ] ...これは、多次元の配列$options_poolの要素に値を動的に割り当てることができるためです。PHPで変数名が動的に形成されていますか?

foreach($option_name_array as $f_var_name) { 
    $f_var_name = $value; //particularly this line 
} 

動作しません:

foreach($this->post_vars as $name => $value) { 
    //Look for $name key in array $options_pool if it exists. 
    //Use multi_array_key_exists() to handle the task 
    //It should return something like "fruit:mango:apple_mango" 
    //Then dynamically call $options_pool based on the data. Like so: $options_pool[ 'fruit' ][ 'mango' ][ 'apple_mango' ] = $value; 
    $match_key = multi_array_key_exists($name, $options_pool); 
    $option_keys = explode(':', $match_key); 
    $option_keys_length = count($option_keys); 
    $option_name_array = array(); 
    if(0 < $option_keys_length) { 
    for($c = $option_keys_length; $c > 0; $c--) { 
     $sub_keys = '$options_pool'; 
     for($c_sub = 0; $c_sub < $c ; $c_sub++) { 
      $sub_keys .= '[ $option_keys[ '. $c_sub . ' ] ]'; 
     } 
     $option_name_array[] = $sub_keys; 
    } 
    foreach($option_name_array as $f_var_name) { 
      //the following line should equal to: $options_pool[ 'fruit' ][ 'mango' ][ 'apple_mango' ] = $value; 
      $f_var_name = $value; 
     } 
    } 
} 

//The $options_pool array 
$options_pool = array('car' => '', 'animals' => '', 'fruit' => array('mango' => array('apple_mango' => '')); 

私はロジックは、コードのこの部分があることを除いて正しいと思いますか?私は $f_var_nameの値を印刷してテストしましたが、結果は正しいですが実際には配列を呼び出さないのですか?

+0

PHPのforeachコンストラクトは、指定された配列のコピーで動作します。 [詳細はこちら](http://php.net/manual/en/control-structures.foreach.php) –

+0

これにはどのような回避策がありますか?私はそれをもっと明確にするために私の質問を更新しました。 – Joann

答えて

1

...これを試してみてください、あなたは正しいです。 変数名は、常に$options_poolとなります。 explode(':', $name)としてキーを渡して後で割り当てることができます。ところで

foreach($option_keys as $option_keys_value) { 
     $option_key_names[] = $option_keys_value; 
} 

であなたのコードは、それだけでコピー$option_keysだけ$option_key_namesとしてあなたが(このコードで)$option_key_names = $option_keys;を書いたかのようにすることをお実現しますか?あなたが繰り返しこの操作を行うことができスタックとたぶん

いますが、ここで

function getVariableToWrite(&$reference, $nested_opts, $write) { 
    if(empty($nested_ops)) // Base case 
     return $reference = write; 
    if(isset($reference[array_shift($nested_ops)])) 
     return getVariableToWrite($reference, $nested_ops, $write); 
    throw new Exception("The key does not exist.."); 
} 

を見るように再帰でそれは、単に、より自然である。そしてちょうど

foreach($this->post_vars as $name => $value) { 
    // Your work over here until... 
    $match_key = "fruit:mango:apple_mango"; 
    $option_keys = explode(':', $match_key); 

    getVariableToWrite($options_pool, $option_keys, $value); 
} 

は、この作業を行うのでしょうか?

+0

答えをありがとう!私は私が自由な時間を得るssonとしてこれに戻る必要があるでしょう。 – Joann

+0

私はあなたが私を誤解したと思います。 '$ match_key' varにはすでに書き込むキーが入っていますので、それをする必要はありません。私は私の質問を更新しました。ありがとう! – Joann

+0

@Joann答えを更新しました。はい、私はあなたがしたことを正確には知らなかった、そのことを念頭に置いて、これはトリックを行うのだろうか? :) – ssice

0

正しくないことを

foreach($option_name_array as $key => $f_var_name) { 
    $option_name_array[$key] = $value; //particularly this line 
} 
1

foreachでは、値を参照で渡す必要があります。編集することができます。

foreach($option_name_array as &$f_var_name){ 
    $f_var_name = $value; 
} 
+0

これは動作しませんでした。var '$ option_name_array 'は操作される配列ではありません。これには、操作対象の配列の名前(連結されたキーの長さが異なる)を表す変数のみが含まれます。 – Joann

+0

ああ、私はそれを認識していませんでした。 –

関連する問題