PHP变量变量和数组/函数

时间:2011-03-09 15:26:59

标签: php variables

我正在尝试使用变量变量,如下所示:

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 个答案:

答案 0 :(得分:5)

函数doesn't可以访问数组。

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>";
  } 
}

请记住,变量变量typically被认为是“不良形式”(尽管没有那么多理由解释为什么,除此之外它感觉很亲切有点像在Javascript中使用eval

请参阅this SO question关于人们是否认为PHP全局变形“不好”。

答案 1 :(得分:1)

foreach($GLOBALS[$nameofmyarray] as $key => $val) {

但严重.. 不使用变量。特别是在将变量名称传递给另一个函数时。它们不仅使您的代码难以阅读,而且也无法通过程序进行分析(如果您想了解原因,请询问对理论计算机科学感兴趣的人。)

除此之外,通常一个数组(可以是全局的或作为函数参数传递)更好更清晰。

顺便说一句,如果您只是想要一种调试打印数组的方法,请使用print_r($array);

答案 2 :(得分:1)

问题不是变量变量,而是您正在访问超出函数范围的变量。从函数内部,您只能访问函数的参数,所谓的superglobals和全局变量(带有语句global $global_variable;)。

请阅读variable scope

如果$ 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

答案 3 :(得分:0)

函数内部不存在

$bookPrices。请参阅变量范围手册。 http://www.php.net/manual/en/language.variables.scope.php

正如其他人所指出的,如果您需要这样做,您必须使用global$GLOBALS。但这并不是最佳做法。