2010-11-15 6 views
1

Supposons que vous avez plusieurs grands tableaux de variables (qui sont généralement des chaînes), et que vous voulez changer la façon dont ils sont affichés sur certaines pages - par exemple en concaténant chacun d'eux avec $prefix et $suffix:Pouvez-vous obtenir un nom de variable sous forme de chaîne en PHP? (? Et si vous)

Comment éviter d'avoir à effectuer toutes ces affectations manuellement?
$arr = array($foo, $bar, $baz) 

$foo_display = $prefix . $foo . $suffix 
$bar_display = $prefix . $bar . $suffix 
$baz_display = $prefix . $baz . $suffix 

Je serais supposé à l'origine il y avoir une fonction qui comme une chaîne (appeler « varname() ») retourne le nom d'une variable, auquel cas le code pourrait ressembler à ceci:

foreach ($arr as &$value) { 
    ${varname($value)."_display"} = $prefix . $value . $suffix 
} 

Mais je ne l'ai pas été capable de trouver une telle fonction, et les gens dans this similar thread semblaient penser que le concept entier était suspect.

PS: Je suis nouveau à la programmation, désolé si cela est une question stupide :)

+0

duplication possible de [Comment obtenir un nom de variable sous forme de chaîne en PHP?] (Http: // stackoverflow.com/questions/255312/comment-obtenir-un-nom-variable-comme-une-chaîne-dans-php) –

+0

Ce n'est pas un doublon - c'est un cas d'utilisation entièrement différent. Cette affiche et moi-même considérons la même stratégie (obtenir des noms de variables comme des chaînes), mais je demande également des commentaires sur la question de savoir si une stratégie différente est tout à fait appropriée à ce que j'essaie d'accomplir. – Zach

+0

Aucun moyen fiable. Si vous le voulez vraiment, vous pouvez essayer de faire de $ value un 'SplString' (php 5.4) et utiliser la magie de __toString et debug_backtrace() pour en déduire un nom de variable d'origine. Cependant, votre cas a le problème supplémentaire d'utiliser "$ value". Lequel, s'il y avait une telle fonction de langage, serait ce qu'une recherche varname() devrait retourner; malgré la référence. Donc, sujet intéressant mais peu d'espoir pour une solution. Allez avec 'new StringWrapper ($ str," name ")' si c'est une nécessité d'application. – mario

Répondre

4

Il y a plusieurs problèmes avec ce que vous voulez faire. Par exemple, le nom de la variable n'est pas accessible. Le code $arr = array($foo, $bar, $baz) crée un tableau avec les valeurs du $foo, etc. Ensuite, si vous modifiez la valeur de $foo, la valeur de $arr[0] est toujours la ancienne valeur de $foo, il est donc ce même pas clair que cela signifierait pour avoir accès au nom des variables.

Même si c'était facile à faire, je le considérerais comme une très mauvaise pratique, simplement parce que vous auriez besoin de savoir par introspection quels seraient les noms de variables correctes.

Bien sûr, tout ceci est facilement résolu si vous aviez un tableau associatif. Par exemple:

 
$arr = array('Foo' => $foo, 'Bar' => $bar, 'Baz' => $baz) 

Ceci pourrait facilement être modifié pour produire ce que vous voulez. Par exemple:

 
$display = array(); 
foreach($arr as $key => $value) 
    $display[$key] = $prefix . $value . $suffix; 
+1

** très mauvaise pratique ** - Je suis complètement d'accord. –

+0

Merci - cette approche fonctionnera très bien. – Zach

0

je besoin d'un exemple plus détaillé de ce que vous essayez d'accomplir, mais la direction je vous donne est de regardez la façon dont PHP fait paires clé/valeur:

http://php.net/manual/en/language.types.array.php

De cette façon, vous pouvez accéder à vos tableaux comme ceci:

foreach ($valsArr as $key => $val) { 
    $displayX = $prefix.$superArr[$key.'_display'].$suffix; 
} 

Cela devra être adapté à vos structures/mappings spécifiques. Aller sur la route d'essayer d'utiliser des noms de variables pour faire n'importe quelle sorte de mappings va être difficile.

0

Bien que l'on peut déduire le nom de la variable du tableau $ GLOBALS, itérer sur les paires valeur variable ne fonctionne tout simplement pas beaucoup de sens quand vous pouvez créer votre propre tableau associatif personnalisé pour suivre ces variables paires de valeurs de toute façon. Et si vous aviez deux ou plusieurs instances de $ value ayant le même contenu, comment vous attendez-vous à ce qu'un programme trace le nom de la variable via l'introspection? Ça va bientôt être un gros gâchis.

Vous devriez vous en souvenir dans le code vous-même.

Questions connexes