2010-08-17 40 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');