5

我正在尝试在我的网站上使用 url 重写,并且我想使用list()andexplode()函数来获取正确的内容。目前我的代码如下所示:

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

在这种情况下$url,等于绝对 url 中第一个斜杠之后的所有内容,即http://example.com/random/stuff => $url = random/stuff/这可以正常工作,但如果我想去,http://example.com/random/那么它将在页面上打印一条通知。如何阻止通知出现我是否需要使用该list()功能以外的东西?

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

谢谢您的帮助!

4

8 回答 8

22

试试这个 :

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

array_pad用你的值完成数组,这里是 : ''

于 2014-11-10T13:28:38.103 回答
11

您应该检查 URL 包含多少个路径段:

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

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

于 2010-03-01T18:18:52.793 回答
4

查看parse_url

于 2010-03-01T18:28:37.450 回答
1

一种解决方案是将您的代码行分成几行,以确保您永远不会将不存在的值分配给变量——这就是您在explode只返回 URL 的一部分时所做的事情。

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


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

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

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


另一种解决方案是检查爆炸将返回多少元素(例如计算数量/;但是您仍然必须处理至少两个案例。

于 2010-03-01T18:18:36.303 回答
1

摆脱通知:

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

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

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

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

于 2010-03-01T18:22:33.970 回答
1

自 PHP 5.4+ 起,在列表分配中抑制 E_NOTICE 的正确方法如下:

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

如果$url包含 no /,explode 将返回一个元素$act并将是NULL

于 2016-12-06T09:04:04.760 回答
0

$_SERVER['PATH_INFO']假设 '/random' 命名脚本,而不是分解完整的 URL,尝试。

于 2010-03-01T18:19:53.410 回答
0

简单而丑陋的答案是用一个'@'作为前缀来抑制错误输出。在这种情况下,$act 将被设置为 null,因为在幕后,它相当于:

$foo = explode('/',$url);
$dir = $foo[0];
$act = $foo[1]; // This is where the notice comes from
于 2010-03-01T18:20:57.777 回答