PHP双层foreach循环代码运行原理及取值疑问咨询
解读这段双层foreach循环的骰子点数统计代码
你应该是混淆了$Score的含义啦!$Score是两个骰子点数的和,取值范围是2到12,根本不会出现1哦~你提到的那个1,2,3,4,5,6,5,4,3,2,1序列,其实是统计结果里的次数序列,不是$Score的取值序列,咱们一步步拆解这段代码,把逻辑理清楚:
代码的核心目的
这段代码是模拟掷两个6面骰子的所有36种可能组合,统计每个点数和(2-12)出现的次数,最后输出每个点数和的出现频率。
双层foreach循环的运行全过程
咱们把外层和内层循环的每一步拆解开看:
- 外层循环:遍历
$FaceValues数组(元素是[1,2,3,4,5,6]),每次取出一个值赋值给$Die1(第一个骰子的点数),顺序是1→2→3→4→5→6。 - 内层循环:每执行一次外层循环,内层都会完整遍历一遍
$FaceValues数组,把值赋值给$Die2(第二个骰子的点数),顺序同样是1→2→3→4→5→6。
所以每一轮外层循环对应的$Score = $Die1 + $Die2结果是这样的:
- 当
$Die1=1时,$Die2从1到6,$Score依次为:2, 3, 4, 5, 6, 7 - 当
$Die1=2时,$Score依次为:3, 4, 5, 6, 7, 8 - 当
$Die1=3时,$Score依次为:4, 5, 6, 7, 8, 9 - 当
$Die1=4时,$Score依次为:5, 6, 7, 8, 9, 10 - 当
$Die1=5时,$Score依次为:6, 7, 8, 9, 10, 11 - 当
$Die1=6时,$Score依次为:7, 8, 9, 10, 11, 12
你误解的关键点
你提到的1,2,3,4,5,6,5,4,3,2,1,其实是$ScoreCount数组里的值的序列,也就是每个点数和出现的次数:
- 点数和2出现1次,3出现2次,4出现3次,5出现4次,6出现5次,7出现6次,8出现5次,9出现4次,10出现3次,11出现2次,12出现1次
这个次数序列刚好是1,2,3,4,5,6,5,4,3,2,1,而不是$Score的取值序列。你应该是把“点数和的出现次数”和“点数和本身的取值”搞混了~
代码里的小细节补充
还有个小问题:代码里的$RollCount变量没有提前初始化,虽然PHP会默认把未声明的变量当成0开始计数,但规范写法应该在循环前加上$RollCount = 0;,避免潜在的问题。
内容的提问来源于stack exchange,提问作者tkss44
相关产品推荐
相关产品推荐

