为什么我在这个PHP代码中收到一个未初始化的字符串偏移?

时间:2012-11-18 16:04:46

标签: php string offset initialization

我为我的课程编写了一个函数,它将接收一个字符串,一个起始编号和一个长度。该函数将获取字符串并输出通过包含和string{n}之后的所有字母创建的字符串

例如:

string = kingsbridge, n = 4, l = 4.
string created = gsbr.  

函数的前两个验证部分工作正常,但是当实际创建要输出的子字符串时,会发生以下情况:

Notice: Uninitialized string offset: 11 in G:\xampp\htdocs\say\ws21C.php on line 58
Notice: Uninitialized string offset: 12 in G:\xampp\htdocs\say\ws21C.php on line 58
Notice: Uninitialized string offset: 13 in G:\xampp\htdocs\say\ws21C.php on line 58    
Notice: Uninitialized string offset: 14 in G:\xampp\htdocs\say\ws21C.php on line 58

......依此类推(无限循环)

这是我的代码:

function substring($s, $n, $l){
    $substring = "";

    if($n > length($s)){     //If asking for substring that starts with an index of the string that's greater than the actual length
        echo "Out of range";
    }
    else{
        if($l > (length($s) - ($n - 1))) { //If start is in index of string but length would mean substring would trail off string
            $newLength = ((length($s)) - ($n - 1));
            substring($s, $n, $newLength);
        }
        else{ //PROBLEM CODE
            for($letter = ($n - 1); $l; $letter++){
                $substring .= $s{$letter};  //Line 58
            }
            echo "$substring";
        }
    }
}

为什么会发生这种情况(或者为什么会产生无限循环)的任何帮助都将不胜感激!

谢谢:)

编辑:我知道在示例中我给了字符串{4}将是s,但是用户输入了数字,所以我将减去1以获得他们需要的字母

1 个答案:

答案 0 :(得分:1)

你的for循环是一团糟,纯粹而简单。仔细看看它(首先清除无限循环问题):

        for($letter = ($n - 1); $l; $letter++){
            $substring .= $s{$letter};  //Line 58
        }

所以,你将$ letter设置为$ n-1,我认为你想要遍历所有字母。然后,你的循环条件是"如果$ l"。您并未在for循环中更改$ l 的值,那么您怎么能指望程序突破它?

如果您试图循环播放所有字母,那么您最好不要执行$letter = $n-1; $letter >= 0; $letter--

最后,我需要$s的内容才能调试其他问题。编辑你的问题!