2015-08-21 3 views
1

У меня есть некоторые переменные, как это:PHP, используя значение переменной в имени переменной

$barbarian = 7; 
$archer = 7; 
$giant = 7; 

и функцию, как это:

function army($troopData,$troop,$thing){ 

    if(isset($troop) && $troopData+1 == ${"$thing"}){ 
     $troopData++; 
     $text = "<span class='army-icon active top-lvl $thing-icon'><span>$troopData</span></span>"; 
    }elseif(isset($troop)){ 
     $troopData++; 
     $text = "<span class='army-icon active $thing-icon'><span>$troopData</span></span>"; 
    }else{ 
     $text = "<span class='army-icon $thing-icon'><span></span></span>"; 
    } 
    return $text; 

} 

Обратите внимание на первый, если: if(isset($troop) && $troopData+1 == ${"$thing"}){

функция называется так: army($troopslvl4000000,$troops4000000, "barbarian"); army($troopslvl4000001,$troops4000001, "archer");

Последний параметр называется функцией $ thing в функции.

Поэтому мне нужно первой строкой, если проверить, если:

1) $troop устанавливается. 2) $troopData+1 == $barbarian (или что-то еще. $archer для вызова второй функции)

Но он не работает. Он всегда использует elseif или else. Первый, если никогда не вызывается ...

+0

В вашем первом утверждении if, что это за '$ {" $ thing "}' должно быть? Это не похоже на действительный PHP для меня – mituw16

+0

@ mituw16, который является переменным variablename. если '$ varname = archer' и' $ archer = 5', то '$$ varname = 5' – inetphantom

+2

да, нотация' $ {"$ thing"} 'также верна, как и' $$ thing'. Я думаю, что проблема заключается в отсутствии «глобальных» заявлений, как в моем ответе. –

ответ

1

Вы можете использовать конструкцию типа:

$s1 = "somevar"; 
$$s1 = "test"; 
echo $somevar; // will output: test 

это в вашем коде:

function army($troopData,$troop,$thing){ 
    global $barbarian; 
    global $archer; 
    global $giant; 

    if(isset($troop) && $troopData+1 == $$thing){ 
    ... 
} 

Edit:

обратите внимание, что вы должны разрешить доступ к переменным и т.д. $barbarian внутри функции!

+0

В EditCase вы должны получить предупреждение от php, в котором говорится: «$ barbarian не определен, предполагается« barbarian »или что-то вроде этого – inetphantom

+0

Сделать их глобальными - спасибо –

0

Для читаемость, чтобы избежать ошибок с приоритетом oporaters добавить скобки как

В этом случае в качестве комментария сказал, что вы не должны: http://php.net/manual/fa/language.operators.precedence.php

+1

'==' имеет более высокий предел, чем '&&', поэтому оставить круглые скобки безопасными. Однако иногда читаемость улучшается, если вы используете избыточные круглые скобки ... –

+0

@MartenKoetsier изменил это. Сори! – inetphantom

Смежные вопросы