我有一个将URL分解为目录的功能。如果我在example.com/test/directory
访问此脚本,则应返回test
function URLPart($part) {
if ($part > 0) {
$url = explode("/", $_SERVER['PHP_SELF']);
return $url[$part - 1];
} else {
return $_SERVER['PHP_SELF'];
}
}
URLPart(1);
为什么不发生这种情况?我一无所获!
答案 0 :(得分:1)
$_SERVER['PHP_SELF']
变量包含初始/
,例如"/test/directory"
。
之前你必须ltrim($_SERVER['PHP_SELF'],'/')
。
$url = explode("/", ltrim($_SERVER['PHP_SELF'], '/'));
或只是:
return $url[$part];
答案 1 :(得分:0)
有两个原因::
因为函数调用不会打印到屏幕 - echo
。您需要回显return
值。
@Syscall是正确的,/
带有$_SERVER['PHP_SELF']
,因此也会放弃您的元素定位。 1 - 1
会让您访问0
元素explode()
的数组。 (我实际上不确定你为什么从$part
减去1。)
我在这里时会提供一些额外的建议。
$part
应该是一个整数,但让我们强制intval()
为真。!$part
来确定值是否为0
$part+3
作为explode()
调用的第3个参数,以便该函数不必执行任何不必要的工作。对于这种情况,我们访问数组的元素2
,因此将路径的其余部分阻塞到元素3
中并不重要。 (参见demo的输出结果)!isset()
条件的原因。++$part
表示添加一个$part
。echo
返回值。代码:(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