当循环遍历数组项时,我已经有过几次这个问题了。
在这个例子中,我正在生成字母表的所有2个字母组合。
代码有效(我知道有一个更容易的方法,用2 for循环来做,但我正在尝试不同的东西)。
但是我必须count
-1
,count()
返回数组长度的数字26,但第26项显然不存在,因为它基于0?
是否有count()
的版本无法在零基础上运行?
<?php
$alphas = range('a', 'z');
$alphacount = count($alphas);
// Why do I have to do this bit here?
$alphaminus = $alphacount -1;
$a = 0;
for ($i=0;$i<$alphacount;$i++) {
$first = $alphas[$a];
$second = $alphas[$i];
if ($i === $alphaminus && $a < $alphaminus ) {
$i = 0;
$a ++;
}
echo "$first$second<br>";
}
?>
没有$alphaminus = $alphacount -1;
我得到未定义的偏移量26?
答案 0 :(得分:2)
怎么样:
<?php
$alphas = range('a', 'z');
$alphacount = count($alphas);
$a = 0;
for ($i=0;$i<$alphacount;$i++) {
$first = $alphas[$a];
$second = $alphas[$i];
if ($i >= $alphacount && $a < $alphaminus ) {
$i = 0;
$a ++;
}
echo "$first$second<br>";
}
所以你不必-1
,因为你不喜欢它! :)
怎么样:
$alphas = range('a', 'z');
for ($i = 0; $i < count($alphas); $i++) {
for ($a = 0; $a < count($alphas); $a++) {
echo "{$alphas[$i]}{$alphas[$a]}\n";
}
}
或忘记数组!这更有趣:)
array_walk($alphas, function ($a) use ($alphas) {
array_walk($alphas, function ($b) use ($a) {
print "$a$b\n";
});
});
答案 1 :(得分:2)
问题是你在循环中将$ i重置为0;然后在遇到循环结束时,$ i递增,因此循环中的下一次运行将使用$ i = 1而不是$ i = 0.
也就是说,字母的下一个子范围以(字母)b而不是(字母)a开头。 (请参阅您的输出:az
后bb
而不是ba
的下一行。)
解决方案:在循环中将$ i重置为-1,然后在结束时它将再次以值0运行。
答案 2 :(得分:1)
你有26个字符,但PHP中的数组是从0索引的。因此,索引是0,1,... 25。
答案 3 :(得分:1)
count
从1开始,由range()
创建的数组从0开始。
这意味着:
$alphas[0] == a
$alphas[25] == z
$count($alphas) = 26; // there are 26 elements. First element is $alphas[0]
答案 4 :(得分:1)
为什么它必须如此复杂?你可以简单地做
foreach ($alphas as $alpha)
{
foreach($alphas as $alpha2)
{
echo $alpha.$alpha2."<br>";
}
}
注意:在该循环体内操作循环计数器变量通常不是一个好主意。在某种情况下,您将$i
设置为0。这可能会给你意想不到的结果,因此你必须在它周围导航。