列表和拆分

7

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

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

在这种情况下,$url等于绝对URL中第一个斜杠后的所有内容,即http://example.com/random/stuff => $url = random/stuff/。虽然这样可以正常工作,但如果我想进入http://example.com/random/,则页面上会显示一个通知。我该如何阻止通知出现?我需要使用除list()函数之外的其他东西吗?
目前通知是“注意:未定义偏移量:1...”
感谢您的帮助!

3
除了解决这个问题之外,你应该在生产网站上关闭 PHP 错误的显示。 - Matthew
8个回答

27

试一下这个:

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

array_pad 函数用给定的值填充数组,这里使用的是:''


使用 list($a, $b, $c) = explode('/', $url) + ['x', 'y', 'z']; 可以设置不同的默认值。 - Tom
@Tom的解决方案看起来也非常不错。我的建议是使用单个默认值:list($a, $b, $c) = explode('/', $url . '//'); - prokki

11
你应该检查URL包含多少个路径段:
$segments = explode('/', $url);
if (count($segments) !== 2) {
    // error
} else {
    list($dir, $act) = $segments;
}

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


有没有一个更灵活的方法的例子? - cskwrd
@TheGNUGuy:这取决于你的需求,以及你的应用程序如何预期接收其参数。 - Gumbo
我根据您上面的解决方案进行了调整,使用了switch语句以更轻松地处理多个不同的情况。谢谢! - cskwrd

4

这个仅包含链接的回答价值较低。 - mickmackusa

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的情况取决于您的脚本。
另一个解决方案是检查explode将返回多少个元素(例如计数/的数量);但仍需处理至少两种情况。

1

消除提示的方法:

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

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

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

如果没有第二个片段,则 $act 将为空,而您也可以以此方式使用超过 2 个片段。

1

在PHP 5.4+中,抑制列表赋值的E_NOTICE的正确方法如下:

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

如果$url中不包含/,那么explode函数将返回一个元素,$act将为NULL

0

不要将完整的URL拆分,尝试使用$_SERVER['PATH_INFO'],假设'/random'是脚本的名称。


Downvoter:PATH_INFO有什么问题吗? 这个问题含糊不清,允许出现这种可能性。 - outis

-1

简单而丑陋的答案是在整个代码前加上一个 '@' 符号,这样可以抑制错误输出。在这种情况下,$act 将被设置为 null,因为在底层它相当于:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接