PHP统计数组中不同位数数字数量的代码问题排查
问题分析
你提供的代码存在多类错误,导致统计结果不符合预期,具体问题如下:
- 数组索引使用错误:PHP 索引数组默认从0开始,你设置循环初始值
$i=1,还判断$i<=$size,会直接漏掉第一个元素,还会出现最后一次循环访问不存在的数组下标导致报错。 - 统计对象错误:你代码里判断的是循环变量
$i的长度,不是数组中对应下标的元素$myArray[$i]的长度,自然统计结果完全不符合预期。 - 语法逻辑错误:
strlen($i==3)的写法逻辑完全错误,等于先执行$i==3得到布尔值,再求布尔值的字符串长度,永远得不到正确结果,正确写法应该是先把数组元素转字符串求长度,再和目标位数对比。- 循环语句里的
i++漏了$符号,应该是$i++,代码会直接报错。 - 第二段代码里数组定义
$myArray=(123...)漏了array关键字,PHP7+也可以用短数组写法[],原写法属于语法错误。 - 第二段代码里
if(strlen($==3))属于语法错误,变量名缺失。
修正后的代码
这里推荐使用foreach遍历数组,不需要手动处理下标,逻辑更简洁不容易出错:
<?php // 初始化统计变量 $twoDigits = 0; $threeDigits = 0; $fourDigits = 0; $fiveDigits = 0; $sixDigits = 0; // 定义数组 $myArray = [123,1234,12345,123456,1234567,111,222]; // 遍历数组 foreach ($myArray as $num) { $len = strlen((string)$num); switch ($len) { case 2: $twoDigits++; break; case 3: $threeDigits++; break; case 4: $fourDigits++; break; case 5: $fiveDigits++; break; case 6: $sixDigits++; break; } } // 输出结果 echo "There are " . $twoDigits . " numbers with 2 digits.\n"; echo "There are " . $threeDigits . " numbers with 3 digits.\n"; echo "There are " . $fourDigits . " numbers with 4 digits.\n"; echo "There are " . $fiveDigits . " numbers with 5 digits.\n"; echo "There are " . $sixDigits . " numbers with 6 digits.\n"; ?>
如果一定要用for循环,写法如下:
<?php $twoDigits = 0; $threeDigits = 0; $fourDigits = 0; $fiveDigits = 0; $sixDigits = 0; $myArray = [123,1234,12345,123456,1234567,111,222]; $size = count($myArray); // 下标从0开始,判断条件为小于数组长度 for($i=0; $i < $size; $i++) { $len = strlen((string)$myArray[$i]); if ($len == 2) $twoDigits++; elseif ($len == 3) $threeDigits++; elseif ($len == 4) $fourDigits++; elseif ($len == 5) $fiveDigits++; elseif ($len == 6) $sixDigits++; } echo "There are " . $threeDigits . " numbers with 3 digits."; // 会正确输出3 ?>
内容的提问来源于stack exchange,提问作者user10981554
相关产品推荐
相关产品推荐

