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 的原因有两个:
因为函数调用不会打印到屏幕——echo
会。您需要回显您的 return
值。
@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
我有一个函数可以将 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 的原因有两个:
因为函数调用不会打印到屏幕——
echo
会。您需要回显您的return
值。@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