2011-03-09 117 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}); 

最好的問候,