简单的循环,围绕字符串不工作?



基本上,我想生成任意长度的音符字符串,例如从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),但下一次(数字+索引)>它再也不工作了。为什么它只在循环中的第一次有效?

您的问题是您试图在foreach内部的if块中分配$number,但在每个循环结束时,$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 

3v4l.org的演示

相关内容

  • 没有找到相关文章

最新更新