PHP如何遍历数组并删除值最小的对应键元素?
原代码核心问题
原代码存在多个逻辑和函数用法错误,直接导致删除功能失效:
- 循环结构不合理:用固定迭代次数的for循环处理动态长度的玩家数组,会因为数组长度持续变小提前结束循环,应该用
while循环判断剩余玩家数量大于1作为运行条件 - 执行顺序错误:在遍历玩家分配随机数的
foreach内部直接执行排序、算最小值、删除操作,还没给当前轮所有玩家分配完随机数就提前执行淘汰逻辑,完全不符合需求 array_splice用法错误:该函数第二个参数要求传入索引数组的数字偏移量,你传入的是最小数值本身,自然删不到目标玩家;且你的玩家数组是关联数组,应该用unset()删除指定键对应的元素- 缺少多最小值处理逻辑:原代码仅能打印1个最小数值玩家,无法处理多个玩家数值同为最小值的批量淘汰场景
修正后可运行代码
<?php // 初始化玩家数组 $players = [ "Peter" => 0, "John" => 0, "Harold" => 0, "Alexander" => 0, "Thor" => 0, "Paul" => 0, "Jimmy" => 0, "Erik" => 0, "Donald" => 0, "Matthew" => 0 ]; $round = 1; // 只要剩余玩家数大于1就继续回合 while (count($players) > 1) { echo "<br><b>Round {$round}</b><br>"; $round++; // 第一步:给当前所有玩家分配本轮随机数 foreach ($players as $key => $value) { $players[$key] = rand(1, 50); } // 第二步:计算本轮最小数值,找出所有持有最小值的玩家 $min_value = min($players); $eliminated_players = array_keys($players, $min_value); // 第三步:打印淘汰名单 echo "本轮被淘汰的玩家(最小数值为{$min_value}):" . implode('、', $eliminated_players) . "<br>"; // 第四步:删除被淘汰的玩家 foreach ($eliminated_players as $p) { unset($players[$p]); } } // 最后剩下的就是赢家 $winner = key($players); echo "<br><b>最终获胜者是:{$winner}</b>"; ?>
代码运行时会逐轮输出淘汰的玩家信息,如果同一轮有多个玩家拿到同样的最小数值会同时淘汰,直到仅剩1名玩家输出获胜结果。
内容的提问来源于stack exchange,提问作者Sedrido
相关产品推荐
相关产品推荐

