列出并分解

list and explode

提问人:cskwrd 提问时间:3/2/2010 最后编辑:Justin Johnsoncskwrd 更新时间:9/11/2017 访问量:38665

问:

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

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

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

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

感谢您的帮助!

php 列表 数组 url-重写 爆炸

评论

3赞 Matthew 3/2/2010
撇开此问题的修复不谈,您应该关闭生产站点上 PHP 错误的显示。

答:

1赞 Pascal MARTIN 3/2/2010 #1

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

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


例如,像这样的东西可能是可以的:

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

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


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

11赞 Gumbo 3/2/2010 #2

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

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

但也许你应该选择一种比使用 .list

评论

0赞 cskwrd 3/2/2010
更灵活的方法的例子是什么?
0赞 Gumbo 3/2/2010
@TheGNUGuy:这取决于您的要求,以及您的应用程序期望如何接收其参数。
0赞 cskwrd 3/2/2010
我调整了您上面的解决方案以使用 switch 语句,以便更轻松地处理多种不同的情况。谢谢!
0赞 outis 3/2/2010 #3

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

评论

0赞 outis 3/2/2010
反对者:PATH_INFO怎么了?这个问题含糊不清,足以允许这种可能性。
-1赞 Luke 3/2/2010 #4

简单而丑陋的答案是用一个“@”作为整个事情的前缀,以抑制错误输出。在这种情况下,$act将设置为 null,因为在后台,它等效于:

$foo = explode('/',$url);
$dir = $foo[0];
$act = $foo[1]; // This is where the notice comes from
1赞 Mathieu 3/2/2010 #5

要摆脱该通知:

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

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

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

如果没有第 2 段,则$act将为 null,您也可以通过这种方式超过 2 段

4赞 dnagirl 3/2/2010 #6

查看parse_url

评论

0赞 mickmackusa 12/1/2018
这个仅链接的答案是低价值的。
27赞 Snoozer 11/10/2014 #7

试试这个:

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

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

评论

0赞 Tom 3/30/2018
list($a, $b, $c) = explode('/', $url) + ['x', 'y', 'z'];具有不同的默认值
0赞 prokki 8/29/2019
@Tom的解决方案看起来也很不错。我对单个默认值的建议list($a, $b, $c) = explode('/', $url . '//');
1赞 giosh94mhz 12/6/2016 #8

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

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

如果包含 no ,则 explode 将返回一个元素,并且将是 。$url/$actNULL