未初始化的字符串偏移错误

Uninitialized string offset error

为什么我收到未初始化的字符串错误,我搞不懂?

这是我的函数:

function show_site_name($url,$lenght)
{
    $name='';
    $i=0;
    $slash=0;
    while($slash<3 && $i<=$lenght)
    {
        if($url[$i]=='/') $slash++;
        if($url[$i]!='/' && $slash==2) $name.=$url[$i];
        $i++;
    }
    return($name);
}

已编辑: 我在这两行收到 "Uninitialized string offset" 错误:

    if($url[$i]=='/') $slash++;
    if($url[$i]!='/' && $slash==2) $name.=$url[$i];

这个功能比较傻。 PHP 为 parsing a url 提供了很好的原生功能。另外,我假设 "lenght" 是第一个参数的长度?这当然可以用 strlen.

导出
show_site_name('http://www.example.com', strlen('http://www.example.com'));

将导致 Uninitialized string offset: 22

show_site_name('http://www.example.com', strlen('http://www.example.com')-1);

以上可能就是您想要的。选项基数为零,而不是一。

if($url[$i]=='/') $slash++;

上面一行是您超出字符串偏移量的地方。糟糕的逻辑。您可以修复代码并避免它或使用 isset 处理它。相信你的错误日志。

更新:

您可以像我展示的那样传递理智的参数来避免它。或者改成:

if (isset($url[$i])) {
    if($url[$i]=='/') $slash++;
} else {
    return $name;
}

但同样,这很愚蠢。

如果你非要这样做,那我们就叫它学习吧。为什么不这样做:

function show_site_name($url)
{
    $lenght = strlen($url) -1;
    ...

传递可以简单地从第一个参数派生的第二个参数不是一个好的方法。