2011-03-09 116 views
1

我试图按如下方式使用可变变量:PHP变量变量和数组/功能

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()提供的无效参数;

任何人都知道我可以在这种情况下使用变量变量?

+0

您使用的智者什么 SWilk ??? '$ {$ nameofmyarra}' – kjy112

+1

@ kjy112:阅读http://php.net/manual/en/language.variables.variable.php –

+1

这是一个变量变量。海事组织是一个糟糕的事情,就像GOTO一样糟糕。 – ThiefMaster

回答

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

但是严重.. 不使用变量变量。特别是在将变量名称传递给另一个函数时。它们不仅使你的代码难以阅读,而且不可能通过程序进行分析(如果你想知道为什么,请问对理论计算机科学感兴趣的人)。

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

顺便说一句,如果你只是想办法调试打印阵列,使用print_r($array);

+0

+1,你解释了为什么不。 :) –

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

问题不是一个变量变量,而是一个事实,即你正在访问一个超出函数范围的变量。从函数内部只能访问函数的参数,即所谓的superglobals和全局变量(语句为global $global_variable;)。

Pleae了解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}); 

最好的问候,