列表和爆炸

时间:2010-03-01 18:14:38

标签: php list arrays url-rewriting explode

我正在尝试在我的网站上使用网址重写,我想使用list()explode()功能来获取正确的内容。 目前我的代码如下所示:

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

在这种情况下,$url等于绝对网址中第一个斜杠之后的所有内容,即http://example.com/random/stuff => $url = random/stuff/这样可以正常工作,但是如果我想转到http://example.com/random/则会打印出来页面上的通知。如何停止显示通知我是否需要使用list()功能以外的其他功能?

现在通知是“通知:未定义的偏移量:1 ......”

感谢您的帮助!

8 个答案:

答案 0 :(得分:13)

试试这个:

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

array_pad使用您的值填充数组,此处为:''

答案 1 :(得分:8)

您应该检查网址包含的路径段数:

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

但也许您应该选择比使用list更灵活的方法。

答案 2 :(得分:4)

查看parse_url

答案 3 :(得分:1)

解决方案是将您的代码行拆分为多个,以确保您永远不会将不存在的值分配给变量 - 当explode仅返回URL的一部分时,您正在执行此操作。

为此,不使用list似乎是正确的解决方案,因为使用list,您必须知道=右侧的表达式将返回多少元素...
并且,在这种情况下,您不知道将返回多少元素explode


例如,这样的事情可能没问题:

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

当然,由您来处理脚本中稍后未设置$dir和/或$act的情况。


另一个解决方案是检查爆炸将返回多少元素(例如计算/的数量);但你至少还要处理两起案件。

答案 4 :(得分:1)

摆脱通知:

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

但也许更好的解决方案是:

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

如果没有第二段,$ act将为空,您也可以通过这种方式进行2次以上

答案 5 :(得分:1)

从PHP 5.4+开始,在列表分配上禁止E_NOTICE的正确方法如下:

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

如果$url不包含/,则展开将返回一个元素,$act将返回NULL

答案 6 :(得分:0)

请尝试$_SERVER['PATH_INFO'],而不是爆炸完整的网址,假设'/ random'为脚本命名。

答案 7 :(得分:0)

简单而丑陋的答案是在整个事物前面添加一个“@”来抑制错误输出。在这种情况下,$ act将设置为null,因为在引擎盖下,它等同于:

$foo = explode('/',$url);
$dir = $foo[0];
$act = $foo[1]; // This is where the notice comes from