2010-08-14 2 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

+0

[Array Dereferencing скоро придет к PHP рядом с вами] (http: // schlueters.de/blog/archives/138-Features-in-PHP-trunk-Array-dereferencing.html) – Gordon

ответ

3

Это (глупое) ограничение текущего парсера PHP, что ваш первый пример не работает. Однако, предположительно, следующая основная версия PHP исправит это.

5

В отличие от Javascript, PHP не может адресовать элемент массива после функции. Вы должны разбить его на два утверждения или использовать array_slice().

+0

Да, это так. :) Но почему? Есть ли веская причина в разработке языка? Или разработчики PHP просто не думали об этом? Или это почему-то трудно сделать это возможным? – Albert

+0

Вы можете использовать функции current() и next() для 0 и 1 элементов. – Anpher

+0

Или используйте 'list' с левой стороны. – strager

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

+0

Спасибо за подсказку. Хотя, единственное, что я хочу, это получить все, что угодно до первого '?', Поэтому я думаю, что «взорваться» здесь просто легче, не так ли? – Albert

+0

@Albert & @Artefacto - Хорошо, отредактировал его. –

0

EDIT:

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

array_shift должен быть передан аргумент по ссылке. – Artefacto

+0

Что относительно тока()? – NAVEED

+0

То же самое. См. [Manual] (http://pt.php.net/current). – Artefacto

4

Это допускается только в отрасли разработки PHP (это новая функция под названием "массив разыменования"):

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

Вы можете сделать это

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

или использовать array_slice/temp переменная, как stillstanding. Вы не должны использовать array_shift, так как он ожидает аргумент, переданный по ссылке.

+1

-1 Он не хочет использовать дополнительную переменную (temp) и хочет получить к ней доступ напрямую. В чем разница между $ noQ (в вашем андерсере) и $ temp (в его вопросе) здесь. – Awan

0

Я считаю, что PHP 5.4 поставляется с этой функцией, наконец. К сожалению, это будет некоторое время, прежде чем ваш средний веб-хост обновит свою версию PHP. Мой Ubuntu VPS даже не имеет его в репозиториях по умолчанию.

Смежные вопросы