2010-08-14 249 views
6

爲什麼此代碼無法工作?PHP:獲取數組元素

echo explode("?", $_SERVER["REQUEST_URI"])[0]; 

它說的是syntax error, unexpected '['

奇怪的是,這個工程:

$tmp = explode("?", $_SERVER["REQUEST_URI"]); 
echo $tmp[0]; 

但我真的想避免在這裏建立這樣一個$tmp變量。

我該如何解決?


在有幫助的答案之後,還剩下一些問題:是否有任何良好的語言設計的理由使這不可能?還是PHP的實現者沒有想到這個?還是由於某種原因難以實現這一點?

+0

請參閱http://wiki.php.net/rfc/functionarraydereferencing – GZipp 2010-08-14 20:28:37

+0

[Array Dereferencing將盡快到您的PHP附近](http:// schlueters。de/blog/archives/138-Features-in-PHP-trunk-Array-dereferencing.html) – Gordon 2010-08-25 10:26:24

回答

3

這是(愚蠢的)限制當前PHP解析器,你的第一個例子不起作用。然而,據說PHP的下一個主要版本將解決這個問題。

5

與Javascript不同,PHP無法在函數之後尋址數組元素。你必須把它分成兩個語句或使用array_slice()。

+0

是的,看起來如此。 :) 但爲什麼?這種語言的設計有什麼好的理由嗎?還是PHP的實現者沒有想到這個?還是由於某種原因難以實現這一點? – Albert 2010-08-14 19:52:22

+0

您也可以對0和1元素使用current()和next()函數。 – Anpher 2010-08-14 20:27:19

+0

或者使用左側的'list'。 – strager 2010-08-14 20:37:53

2

Take a look at this previous question

Hoohaah使用strstr()的建議非常好。下面將從字符串的開頭返回,直到第一?(第三個爲參數的strstr()僅適用於PHP 5.3.0起):

echo strstr($_SERVER["REQUEST_URI"], "?", TRUE); 

或者,如果你想堅持爆炸,你可以使用,如果list()。 (2表示最多爆炸返回2個元素)。

list($url) = explode("?", $_SERVER["REQUEST_URI"], 2); 
echo $url; 

最後,要使用本機可用的PHP URL parsing;

$info = parse_url($_SERVER["REQUEST_URI"]); 
echo $info["scheme"] . "://" . $info["host"] . $info["path"]; 
+1

他正在嘗試將其刪除,而不是恢復它。 – Artefacto 2010-08-14 19:46:51

+0

感謝您的提示。雖然,我唯一想要的就是在第一個'?'之前得到所有東西,所以我猜'爆炸'在這裏更容易,不是嗎? – Albert 2010-08-14 19:48:04

+0

@Albert&@Artefacto - 好,編輯它。 – 2010-08-14 19:52:38

0

編輯:

echo current(explode("?", $_SERVER["REQUEST_URI"])); 
+1

array_shift應通過引用傳遞參數。 – Artefacto 2010-08-14 19:46:16

+0

current()? – NAVEED 2010-08-14 22:20:52

+0

同樣的事情。請參閱[手動](http://pt.php.net/current)。 – Artefacto 2010-08-15 00:48:04

4

這是隻允許在PHP的開發分支(這是一個所謂的新功能 「數組語法」):

echo explode("?", $_SERVER["REQUEST_URI"])[0]; 

你可以做到這一點

list($noQs) = explode("?", $_SERVER["REQUEST_URI"]); 

或使用array_slice/temp變數,如stillstanding表示。您不應該使用array_shift,因爲它期望通過引用傳遞參數。

+1

-1他不想使用額外的變量(temp)並想直接訪問它。 $ noQs(在你的anwser中)和$ temp(在他的問題中)在這裏有什麼區別。 – Awan 2010-08-15 06:08:47

0

我相信PHP 5.4自帶了這個功能,終於終於有了。不幸的是,在你的普通網絡主機更新他們的PHP版本之前還需要一段時間。我的Ubuntu VPS甚至沒有在默認回購中使用它。