2010-08-17 6 views
0

$ str = 'input_arr [ "username"]';PHP 4 가변 변수

$ input_arr = array();

$$ str = 'abcd';

print_r ($ input_arr);

위 코드를 실행하면 Array() 만 인쇄됩니다.

나는 그것이 배열을 인쇄하는 데 예상 시간 ([사용자 이름] => 'ABCD') 내가 잘못하고있는 중이 야 무엇

?

이것은 PHP 4에 있습니다.

고마워요.

편집 : 무엇을하려고합니까?

$ input_arr은 유효성이 검사 된 사용자 입력을 유지하는 정적 변수라고 가정합니다. 그러나 최근에 나는 php4.3이 self :: $ input_arr을 지원하지 않는다는 것을 깨달았습니다. 그래서 bar ($ input_arr [ 'name'], $ value); 그래서 bar()의 정적 변수에 값을 저장할 수 있습니다. $ input_arr [ 'name']이 현재 범위에 없기 때문에 문자열로 만들어야했습니다.

+4

잘못된 배열을 사용하고 있습니다. 변수 변수는 디버그하기가 쉽지 않습니다. 너 정확히 뭘 하려구? 나는 그것을 할 수있는 더 좋은 방법이 있다고 확신합니다. – quantumSoup

+0

나는 이것을 가지고 약간의 기본적인 테스트를했는데 네가 맞다. 작동하지 않는다. 필자는 변수의 변수를 통해 배열의 요소를 조작하려고 할 때 작동하지 않습니다. 배열 전체를 뒤죽박죽이라면, 내가 시도한 모든 것이 잘 돌아 간다. 그러나 물을 얻기 위해 호수를 건너는 것처럼 보입니다. 정확하게 달성하려는 것은 무엇입니까? – Teekin

+0

내가하려는 일에 대한 정보를 추가했습니다. – zulfazli

답변

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 대신 tokenizer를 사용하는 것에 반대합니까? – janmoesen

+0

누군가 downvotes에 견과류가 : p 코드는 나를 깨끗하게 보였다, upvoted. – dmp

0

그것은 당신이 뭘 하려는지 이야기하는 것은 여전히 ​​어려운,하지만 당신은 $str 어디 $input_arr 내부 데이터의 삶의 조각을 결정하려는 것처럼 들린다. 그렇다면 코드의 문자열 표현이 아닌 $str에 배열 키만 저장해야합니다.

마지막 예에서 $str = 'name'으로 설정 한 다음 $input_arr[$str]을 사용하여 $input['name']에 액세스하는 것만 큼 간단합니다. 첫 번째 경우 $str 대신 $keys = array(3,5) 배열을 사용할 수 있으며 $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');