2010-09-04 63 views
9

通過谷歌(以及我自己的經驗)進行的一些搜索顯示,在PHP中,如果從同一行的函數調用中返回,則無法獲取數組元素。例如,你不能做:從函數返回時訪問數組元素

echo getArray()[0]; 

不過,我遇到一個整潔的小竅門:

echo ${!${false}=getArray()}[0]; 

它的實際工作。問題是,我不知道爲什麼它的工作原理。如果有人能解釋,那會很好。

謝謝。

+1

它絕對不** **不使你的代碼更易讀;) – 2010-09-04 13:51:04

回答

10
echo ${!${false}=getArray()}[0]; 

這是如何工作的,一步一步

${false}=getArray() 

分配的getArray到結果具有空名稱的變量(''或null將工作而不是假)

!${false}=getArray() 

否定上述值,將其以布爾值FALSE

${!${false}=getArray()} 

先前(假)值轉換爲(空)串,並使用此字符串作爲變量名。也就是說,這是步驟1中的變量,等於getArray的結果。

${!${false}=getArray()}[0]; 

獲取該「空」變量的索引並返回一個數組元素。

同樣的想法

echo ${1|${1}=getArray()}[1]; 
echo ${''.$Array=getArray()}[1]; 

function p(&$a, $b) { $a = $b; return '_'; } 
echo ${p($_, getArray())}[1]; 

至於爲什麼getArray()[0]不工作的一些更多的變化,這是因爲PHP團隊不知道如何得到它的工作。

+0

完美,謝謝。 – Daniel 2010-09-04 14:23:47

+0

很好的例子,非常豐富的+1 – RobertPitt 2010-09-04 14:26:06

3

它的工作原理是因爲您使用大括號將值變爲varialbe,因此是一個示例。

爲什麼會有這樣的需要,這是需要包住你想將一個字符串或返回的值到一個變量,例如

${$_GET['var']} = true; 

這是不好的做法,應該不會被IMO使用。

如果您想直接運行斷電功能,你應該使用的對象,例如

function test() 
{ 
    $object = new stdClass(); 
    $object->name = 'Robert'; 

    return $object; 
} 
echo test()->name; 
2

應該指出,你可以可以做到這一點從PHP 5.4起。從數組解引用手冊:

從PHP 5.4起,可以直接對函數或方法調用的結果進行數組解引用。之前只能使用臨時變量。

實施例:

function theArray() { 
    return range(1, 10); 
} 

echo theArray()[0]; 
// PHP 5.4+: 1 
// PHP -5.4: null 

預PHP 5.4:試圖訪問還沒有被定義的陣列密鑰是相同的訪問的任何其他未定義的變量:一個E_NOTICE級錯誤訊息會發出,結果將是NULL。

手冊: