PHP使用array_rand排除指定选中值时出现无限加载的问题
问题根因
你编写的代码触发无限加载的核心原因是:随机键值$rkey仅在进入while循环前生成了一次。如果首次随机到的元素属于$exclude排除列表,while循环内不会重新生成新的随机键,会一直判断同一个不符合要求的值,最终进入死循环。
你之前使用的随机数字逻辑可以正常运行,是因为rand(1,9)写在while循环的判断条件中,每次循环都会重新生成新的随机值,不会卡在同一个无效值上。
修复方案
方案1:对齐原有随机数字逻辑
把array_rand逻辑移入while循环的判断条件,每次循环都重新生成随机键:
$items = array("a", "b", "c", "d", "e", "f", "g", "h"); $exclude = array("a", "b", "c"); while(in_array(($election = $items[array_rand($items)]), $exclude)); echo $election;
方案2:更高效的无循环实现(推荐)
先通过array_diff过滤掉排除项,再直接从合法元素中随机取值,完全避免循环逻辑,性能更稳定:
$items = array("a", "b", "c", "d", "e", "f", "g", "h"); $exclude = array("a", "b", "c"); // 过滤得到所有合法可选元素 $validItems = array_diff($items, $exclude); // 从合法元素中随机取值 $election = $validItems[array_rand($validItems)]; echo $election;
内容的提问来源于stack exchange,提问作者Xiriga
相关产品推荐
相关产品推荐

