PHP嵌套foreach按分类限量选元素时返回结果数量不符问题
问题原因
- 比较运算符误用为赋值运算符
代码中if判断写的是$biciSingola->category_id = $key,这里=是赋值操作,会直接把$key的值赋值给$biciSingola->category_id,且该表达式永远返回布尔值true,相当于所有自行车都会通过分类匹配的判断。正确应该用全等===或者相等==做比较。 - 计数器初始化位置错误
你把$contatoreqty = 1放在了内层foreach的循环体内,每遍历一辆自行车都会把计数器重置为1,计数器永远无法累计超过阈值,所以符合条件的所有自行车都会被推入结果数组。正确应该把计数器初始化放在外层foreach体内、内层foreach体外,每个分类遍历前只初始化一次计数器。
修正后代码
foreach ($categoryArr as $key => $value) { // 每个分类遍历前仅初始化一次计数器 $contatoreqty = 1; foreach ($biciCorretta as $chiave => $valore) { $biciSingola = $valore; // 替换为全等运算符做相等判断,避免赋值逻辑 if ($biciSingola->category_id === $key && $contatoreqty <= $value) { if (!in_array($biciSingola,$biciSelezionata, true)) { array_push($biciSelezionata, $biciSingola); } $contatoreqty ++; } } echo "$contatoreqty <br>"; }
可选优化
已经取到目标数量的自行车后,可以提前终止内层循环,减少不必要的遍历:
foreach ($categoryArr as $key => $value) { $contatoreqty = 1; foreach ($biciCorretta as $chiave => $valore) { // 取够数量直接跳出内层循环 if ($contatoreqty > $value) { break; } $biciSingola = $valore; if ($biciSingola->category_id === $key) { if (!in_array($biciSingola,$biciSelezionata, true)) { array_push($biciSelezionata, $biciSingola); } $contatoreqty ++; } } echo "$contatoreqty <br>"; }
内容的提问来源于stack exchange,提问作者alessio scionti
相关产品推荐
相关产品推荐

