2010-08-14 155 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甚至没有在默认回购中使用它。