微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

环绕字符串的简单循环不起作用?

如何解决环绕字符串的简单循环不起作用?

基本上,我想生成任意长度的音符串,例如从 A 到 G,在 G 之后它自然地环绕到另一个八度音程的 A。到目前为止,我有这个:

function generateNotes($start,$numbers) {
    $notes = ['A','B','C','D','E','F','G'];

    $indice = array_search($start,$notes);

    foreach (range(0,$numbers-1) as $number) {
    
        
        if(($number + $indice) >= count($notes)) {
                $number -= count($notes);
        } 
        
        echo ($number + $indice) . " ";
        
    }

}

echo generateNotes('E',24);

我得到的是以下内容,这让我很困惑:

4 5 6 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 

它第一次起作用,6(即 G)环绕到 0(A),但是下一次(数字 + 指数)> 6 它将不再起作用。为什么它只在循环内第一次工作?

解决方法

您的问题是您试图在 $number 内的 if 块中分配 foreach,但在每个循环结束时,$number 的值为再次被 foreach 覆盖,所以你所做的没有任何影响。使用模运算更容易:

function generateNotes($start,$numbers) {
    $notes = ['A','B','C','D','E','F','G'];
    $num_notes = count($notes);
    $indice = array_search($start,$notes);

    foreach (range(0,$numbers-1) as $number) {
        echo (($number + $indice) % $num_notes) . " ";
    }
}

echo generateNotes('E',24);

输出:

4 5 6 0 1 2 3 4 5 6 0 1 2 3 4 5 6 0 1 2 3 4 5 6 

Demo on 3v4l.org

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。