список и взорваться - PullRequest
       17

список и взорваться

3 голосов
/ 01 марта 2010

Я пытаюсь использовать переписывание URL на своем веб-сайте и хочу использовать функции list() и explode() для получения нужного контента. В настоящее время мой код выглядит так:

list($dir, $act) = explode('/',$url);

В этом случае $url равно всему после первой косой черты в абсолютном URL, т. Е. http://example.com/random/stuff => $url = random/stuff/ будет работать нормально, но если я захочу перейти к http://example.com/random/, тогда он напечатает уведомление на странице. Как остановить отображение уведомления, нужно ли использовать что-то кроме функции list()?

Прямо сейчас уведомление: «Уведомление: неопределенное смещение: 1 ...»

Спасибо за помощь!

Ответы [ 8 ]

13 голосов
/ 10 ноября 2014

Попробуйте это:

list($dir, $act) = array_pad(explode('/',$url), 2, '');

array_pad заполните массив своими значениями, вот так: ''.

8 голосов
/ 01 марта 2010

Вы должны проверить, сколько сегментов пути содержит URL:

$segments = explode('/', $url);
if (count($segments) !== 2) {
    // error
} else {
    list($dir, $act) = $segments;
}

Но, возможно, вам следует выбрать более гибкий подход, чем использование list.

4 голосов
/ 01 марта 2010

Выезд parse_url

1 голос
/ 06 декабря 2016

Правильный способ подавления E_NOTICE при назначении списка в PHP 5.4+ заключается в следующем:

@list($dir, $act) = explode('/', $url);

Если $url не содержит /, разнесение вернет один элемент и $act будет NULL.

1 голос
/ 01 марта 2010

, чтобы избавиться от уведомления:

list($dir, $act) = explode('/',$url);

, но, возможно, лучшим решением будет:

$segments = explode ('/', $url);
$dir = array_shift ($segments);
$act = array_shift ($segments);

, если нет 2-го сегмента, $ act будет нулевым, а выможет также больше чем 2 сегмента таким образом

1 голос
/ 01 марта 2010

Решение состоит в том, чтобы разделить вашу строку кода на несколько, чтобы гарантировать, что вы никогда не назначите несуществующие значения переменным, что вы и делаете, когда explode возвращает только одну часть URL.

Для этого использование list кажется правильным решением, так как со списком вы должны знать, сколько элементов вернет выражение справа от = ...
И, в этой ситуации, вы не знаете, сколько элементов explode вернет .


Например, что-то вроде этого может быть в порядке:

$parts = explode('/', $url);
if (isset($parts[0])) {
  $dir = $parts[0];
  if (isset($parts[1])) {
    $act = $parts[1];
  }
}

Конечно, вам решать ситуацию, в которой $dir и / или $act не установлены, позже в вашем сценарии.


Другое решение состоит в том, чтобы проверить, сколько элементов взорвется, вернет (считая число, например, /) ; но вам все равно придется иметь дело как минимум с двумя делами.

0 голосов
/ 01 марта 2010

Простой и некрасивый ответ состоит в том, чтобы поставить перед всем префикс одним «@», который подавляет вывод ошибок. В этом случае для $ act будет установлено значение null, поскольку под капотом оно эквивалентно:

$foo = explode('/',$url);
$dir = $foo[0];
$act = $foo[1]; // This is where the notice comes from
0 голосов
/ 01 марта 2010

Вместо того, чтобы взрывать полный URL, попробуйте $_SERVER['PATH_INFO'], предполагая, что '/ random' называет скрипт.

...