Переменные PHP и переменные / массивы / функции - PullRequest
1 голос
/ 09 марта 2011

Я пытаюсь использовать переменную следующим образом:

function keyValMyArray($nameofmyarray) {
  foreach(${$nameofmyarray} as $key => $val) {
    print "$key: $val<br>";
  } 
}

$bookPrices = Array('Catcher in the Rye' => '$2', 'Curious George' => '$4.25', 'Dracula' => '$8');

keyValMyArray('bookPrices')

Это не работает. Я получаю сообщение об ошибке: указан неверный аргумент для foreach ();

Кто-нибудь знает, как я могу использовать переменную переменную в этом случае?

Ответы [ 4 ]

5 голосов
/ 09 марта 2011

Функция не не имеет доступа к массиву.

function keyValMyArray($nameofmyarray) {
  global ${$nameofmyarray};
  foreach(${$nameofmyarray} as $key => $val) {
    print "$key: $val<br>";
  } 
}

или:

function keyValMyArray($nameofmyarray) {
  foreach($GLOBALS[$nameofmyarray] as $key => $val) {
    print "$key: $val<br>";
  } 
}

Однако имейте в виду, что переменные переменные как правило считается "плохой формой" (хотя там не так уж много объяснений, объясняющих точно почему , за исключением того, что это выглядит немного грязно, как использование eval в JavaScript).

См. этот SO вопрос о том, считают ли люди глобальные PHP "плохими".

1 голос
/ 09 марта 2011

Проблема не в переменной, а в том, что вы обращаетесь к переменной, которая находится вне области действия функции.Изнутри функции вы можете получить доступ только к параметрам функции, так называемым суперглобальным и глобальным переменным (с оператором global $global_variable;).

Просьба прочитать о область действия переменной

Если $ bookPrices - глобальная переменная, вы можете попробовать:

function keyValMyArray($nameofmyarray) { 
    global ${$nameofmyarray};
    foreach(${$nameofmyarray} as $key => $val) { 
        print "$key: $val"; 
    } 
}

Но это не очень хорошая практика, поскольку она будет работать только в особых случаях, когда вы используете глобальные переменные,

Может быть, вы можете просто передать keyValMyArray фактическую переменную, а не ее имя?Это было бы более общим.Таким образом, если вы сможете получить доступ к переменной в том месте, где вы вызываете функцию, она будет работать и для локальных переменных:

function keyValMyArray($myarray) {      
    foreach($myarray as $key => $val) { 
        print "$key: $val"; 
    } 
}

//then use:
keyValMyArray($bookPrices);
//or
$nameOfArray = 'bookPrices');
keyValMyArray(${$nameOfArray});

С уважением, SWilk

1 голос
/ 09 марта 2011
foreach($GLOBALS[$nameofmyarray] as $key => $val) {

А если серьезно .. не используйте переменные переменные. Особенно, если не передать имя переменной другой функции.Они не только делают ваш код трудным для чтения, но и невозможным для анализа программами (спросите кого-нибудь, интересующегося теоретической информатикой, если вы хотите знать почему).

Кроме того, обычно это массив (который может быть глобальнымпередается как параметр функции) гораздо лучше и чище.

Кстати, если вы просто хотите отладить-распечатать массив, используйте print_r($array);

0 голосов
/ 09 марта 2011

$bookPrices не будет существовать внутри вашей функции. Смотрите руководство по переменной области. http://www.php.net/manual/en/language.variables.scope.php

Как отмечали другие, если вам нужно , чтобы сделать это таким образом, вы должны использовать global или $GLOBALS. Это не считается лучшей практикой.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...