URL 不拆分成目录

URL not splitting into directories

我有一个函数可以将 URL 分解为目录。如果我在 example.com/test/directory 访问这个脚本,它应该 return test

function URLPart($part) {
    if ($part > 0) {
        $url = explode("/", $_SERVER['PHP_SELF']);
        return $url[$part - 1];
    } else {
        return $_SERVER['PHP_SELF'];
    }
}

URLPart(1);

为什么这没有发生?我一无所获!

$_SERVER['PHP_SELF'] 变量包含初始 /,例如"/test/directory".

你必须 ltrim($_SERVER['PHP_SELF'],'/'),之前。

$url = explode("/", ltrim($_SERVER['PHP_SELF'], '/'));

或者只是:

return $url[$part];

你得到 nothing 的原因有两个:

  1. 因为函数调用不会打印到屏幕——echo 会。您需要回显您的 return 值。

  2. @Syscall 是正确的,有一个前导 /$_SERVER['PHP_SELF'],所以这也抛弃了你的元素定位。 1 - 1 将让您访问 0 元素 explode() 的数组。 (我实际上不确定你为什么要从 $part 中减去 1。)

趁我在这里,我会提供一些额外的建议。

  • $part 应该是一个整数,但让我们用 intval().
  • 强制它为真
  • !$part用在条件判断是否为0
  • 我已经扩展了您的示例路径字符串以阐明我的下一点。我建议添加 $part+3 作为 explode() 调用的第三个参数,这样函数就不必做任何不必要的工作。对于这种情况,我们正在访问数组的元素 2,因此将路径的其余部分塞入元素 3 是没有意义的。 (请参阅演示的输出以了解其工作原理)
  • 在尝试通过键访问数组元素之前,最好先检查键是否存在——以避免出现通知。这就是 !isset() 条件的原因。
  • ++$part表示在$part.
  • 上加一
  • 我更喜欢在我的代码中先写早期的returns(失败),并将成功的输出放在最低的return。正如我之前所说,echo return 值。

代码:(Demo)

function URLPart($part){
    if(!$part=intval($part)){  // convert to integer and check if zero
        return '/example.com/test/directory/foo/bar/what'; // $_SERVER['PHP_SELF']
    }else{
        $url = explode("/",'/example.com/test/directory/foo/bar/what',$part+3); // $_SERVER['PHP_SELF']
        var_export($url);
        echo "\n\n";
        // when $part=1, offset 2 is desired
        if(!isset($url[++$part])){  // if incremented $part is an invalid / non-existent offset
            return '/example.com/test/directory/foo/bar/what';  // change this to your needs
        }else{
            return $url[$part];
        }
    }
}

echo URLPart(1);  // you must echo the return value if you want it to be printed to screen

输出:

array (
  0 => '',
  1 => 'example.com',
  2 => 'test',
  3 => 'directory/foo/bar/what',
)

test