2010-08-17 45 views
0

$ str ='input_arr [「username」]';php 4個變量

$ input_arr = array();

$$ str ='abcd';

print_r($ input_arr);

當我運行上面的代碼時,它只打印Array()。

我期望它打印陣列([用戶名] => 'ABCD')

我在做什麼錯?

這是在php 4中的方式。

非常感謝。

編輯:我想要做什麼?

$ input_arr應該是一個靜態變量來保存驗證用戶input.However,我最近才意識到 php4.3犯規支持自:: $ input_arr所以我不得不修改我的腳本吧($ input_arr [ '名'],$值);所以我可以將該值保存到bar()中的靜態變量中;由於$ input_arr ['name']在當前範圍中不存在,因此必須將其作爲字符串。

+4

您正在使用數組錯誤。變量變量是一種調試的痛苦。你究竟想要做什麼?我相信有一個更好的方法來做到這一點。 – quantumSoup 2010-08-17 13:21:54

+0

我做了一些基本的測試,你說得對,它不起作用。在我結束時,當我嘗試通過變量變量處理數組的元素時,它停止工作。如果我將整個陣列搞亂了,那麼我嘗試的所有東西都可以正常工作。 但是它確實看起來像你穿過湖泊在這裏得到水,你究竟想要完成什麼? – Teekin 2010-08-17 13:46:57

+0

我已經添加了一些我想要做的事情。 – zulfazli 2010-08-17 14:08:44

回答

3

我會努力避免eval不惜一切代價。使用PHP的內置標記器。

<?php 
error_reporting(-1); 
$input = array(3 => array(5 => 'some value')); 

echo '$input: '; var_dump($input); 

echo '$input[3][5] (directly): '; var_dump($input[3][5]); 

$str = '$input[3][5]'; 
echo "$str (as a variable variable): "; var_dump($$str); 

echo "$str (using eval - don't use this!): "; var_dump(eval("return $str;")); 

$var = null; 
foreach (token_get_all("<?php $str") as $token) { 
    if (isset($token[1]) && $token[1] === '<?php') { 
     continue; 
    } 
    if (isset($token[0]) && $token[0] === T_VARIABLE) { 
     $varName = substr($token[1], 1); 
     $var = $$varName; 
    } else if ($token === '[') { 
     $currentIndex = null; 
    } else if (isset($token[0]) && $token[0] === T_LNUMBER) { 
     $currentIndex = $token[1]; 
    } else if ($token === ']') { 
     $var = $var[$currentIndex]; 
    } else { 
     // Handle/complain about unrecognized input. 
    } 
} 
echo "$str (using tokenizer): "; var_dump($var); 

輸出:

$input: array(1) { 
    [3]=> 
    array(1) { 
    [5]=> 
    string(10) "some value" 
    } 
} 
$input[3][5] (directly): string(10) "some value" 
$input[3][5] (as a variable variable): 
Notice: Undefined variable: $input[3][5] in - on line 10 
NULL 
$input[3][5] (using eval - don't use this!): string(10) "some value" 
$input[3][5] (using tokenizer): string(10) "some value" 
+0

@神祕人:謹慎解釋downvote?我認爲這是最安全的方法(記住,變量變量仍然像糟糕的代碼設計),我明確表示eval是邪惡的。你是否反對使用分詞器而不是eval? – janmoesen 2010-08-17 13:38:57

+0

有人在downvotes上瘋狂:p代碼看起來很乾淨,upvoted。 – dmp 2010-08-17 14:19:24

0

它仍然很難說你想要做什麼,但它聽起來像你想$str以確定裏面$input_arr一塊數據的生命。如果是這樣,您應該只存儲$str中的數組密鑰,而不是代碼的字符串表示形式。

在上例中,它與設置$str = 'name'一樣簡單,然後使用$input_arr[$str]訪問$input['name']。在第一種情況下,您可以使用數組$keys = array(3,5)而不是$str,然後$input_arr[$keys[0]][$keys[1]]將等於$input_arr[3][5]

0

如果你真的想要這個,它可以使用2個變量。如果使用對數組的引用而不是變量變量,則更好。

$input_arr = Array(); 

function somefunction($array, $key) 
{ 
    ${$array}[$key] = 'abcd'; 
} 

function betterfunction(&$array, $key) 
{ 
    $array[$key] = 'abcd'; 
} 

somefunction('input_arr', 'username'); 
betterfunction($input_arr, 'username');