2010-12-14 36 views
0

下面的代碼動態地將鍵連接到現有數組$options_pool。所以最終的表格應該是:$options_pool[ $base_key ][ $first_key ][ $second_key ] ...這樣我就可以動態地爲數組$options_pool這個多維的元素賦值。在PHP中動態形成變量名?

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' => '')); 

我認爲邏輯是正確的除了這部分代碼:

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

不起作用?我測試了打印$f_var_name的值,結果是正確的,但它並不真正調用數組?

+0

PHP中的foreach結構在提供的數組副本上工作。 [瞭解更多。](http://php.net/manual/en/control-structures.foreach.php) – 2010-12-14 18:49:28

+0

那麼可能的解決方法是什麼?我只是更新了我的問題,使其更清晰。 – Joann 2010-12-15 04:23:40

回答

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

感謝您的回答!我將需要回到這裏,因爲我得到空閒時間。 – Joann 2010-12-14 19:06:08

+0

我想你誤解了我。 '$ match_key' var已經包含要寫入的密鑰,所以你不必這樣做。我更新了我的問題。謝謝! – Joann 2010-12-15 04:31:25

+0

@Joann我更新了答案。是的,我完全不知道你做了什麼,考慮到這一點,這是否會訣竅? :) – ssice 2010-12-15 04:46:00

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 2010-12-15 04:39:20

+0

哦,我沒有意識到這一點。 – 2010-12-15 14:22:02