2010-08-17 7 views
0

$ str = 'input_arr ["nom d'utilisateur"]';php 4 variables variables

$ input_arr = array();

$$ str = 'abcd';

print_r ($ input_arr); Lorsque j'exécute le code ci-dessus, il imprime uniquement Array().

Je m'y attendais à imprimer Array ([nom d'utilisateur] => 'abcd')

Qu'est-ce que je fais mal?

C'est en php 4 par ailleurs.

Merci beaucoup.

Éditer: Qu'est-ce que j'essaie de faire? $ Input_arr est censé être une variable statique pour contenir une entrée d'utilisateur validée.Cependant, je viens de réaliser que php4.3 ne supporte pas self :: $ input_arr donc j'ai dû éditer mon script à bar ($ input_arr [ 'nom'], $ valeur); pour que je puisse enregistrer la valeur dans une variable statique dans bar(), puisque $ input_arr ['nom'] n'existe pas dans la portée actuelle, j'ai dû en faire une chaîne.

+4

Vous utilisez des tableaux erronés. Les variables variables sont difficiles à déboguer. Qu'est-ce que vous essayez de faire exactement? Je suis sûr qu'il y a une meilleure façon de le faire. – quantumSoup

+0

J'ai fait quelques tests de base avec ceci et vous avez raison, ça ne marche pas. Pour ma part, il cesse de fonctionner quand j'essaie de jouer avec les éléments du tableau à travers des variables variables. Si je manipule le tableau dans son ensemble, tout ce que j'essaie fonctionne parfaitement. Mais il semble que vous traversiez le lac pour aller chercher l'eau ici, qu'essayez-vous exactement d'accomplir? – Teekin

+0

J'ai ajouté quelques informations sur ce que j'essaie de faire. – zulfazli

Répondre

3

Je m'efforcerais d'éviter eval à tout prix. Utilisez le tokenizer intégré de 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); 

La sortie:

$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

@Mystery personne: soin d'expliquer le downvote? Je pense que c'est l'approche la plus sûre (en gardant à l'esprit que les variables variables sentent toujours comme la mauvaise conception de code) et j'ai précisé que eval est mauvais. Êtes-vous opposé à l'utilisation du tokenizer au lieu de eval, peut-être? – janmoesen

+0

quelqu'un qui devenait fou sur les downvotes: le code de p semblé propre à moi, upvoted. – dmp

0

Il est encore difficile de dire ce que vous essayez de faire, mais il semble que vous voulez $str pour déterminer où à l'intérieur $input_arr un morceau de vie de données. Si tel est le cas, vous devez stocker uniquement les clés de tableau dans $str, et non une représentation sous forme de chaîne du code. Dans votre dernier exemple, il est aussi simple que de définir $str = 'name' puis d'utiliser $input_arr[$str] pour accéder à $input['name']. Dans le premier cas, vous pouvez utiliser un tableau $keys = array(3,5) au lieu de $str, puis $input_arr[$keys[0]][$keys[1]] serait équivalent à $input_arr[3][5].

0

Il pourrait fonctionner avec 2 variables si vous le voulez vraiment. Encore mieux si vous utilisez une référence au tableau au lieu d'une variable variable.

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