如何用array_shift()成对比较数组元素?需跳过已比较元素
解决方案:实现数组的成对比较(跳过已处理元素)
我明白你的问题了——你现在的代码没有跳过已经配对过的第二个元素,导致每次循环都会把上一次的第二个元素当成新的第一个元素来比较,所以出现了连续比较的错误(比如先比[0]&[1],接着又比[1]&[2])。咱们来一步步修复它:
问题根源分析
- 未跳过已处理元素:每次循环只通过
array_shift()移除了第一个元素,但第二个元素仍然留在数组中,下一次循环会把它作为新的第一个元素重复处理,导致连续比较而非成对比较。 - 循环条件不安全:原条件
$arrayedText[1] != STRING_END存在两个问题:一是数组元素是字符串类型,和数字常量STRING_END(7)比较可能出现类型不匹配的问题;二是当数组剩余元素不足2个时,访问$arrayedText[1]会触发索引越界错误。
修改后的完整代码
/*常量*/ define("STRING_END", "7"); // 改为字符串,和数组元素类型一致 /*该函数用于打印两张多米诺骨牌,与问题核心无关*/ function printTiles($left, $right){ echo "<img src='".$left."_.png'/>", "<img src='_".$right.".png'/>"; } /*主算法*/ $text = "1,2,4,4,4,6,7"; //目标是检查字符串中每对元素是否相同 $arrayedText= explode(",", $text); //现在得到包含字符串所有数字的数组 $doubleTiles = false; //用于标记是否找到成对骨牌 // 循环条件改为检查数组至少有2个元素,避免索引越界,同时保证能取到一对元素 while (count($arrayedText) >= 2) { // 连续两次调用array_shift,取出当前一对的两个元素,直接跳过已处理的元素 $firstTile = array_shift($arrayedText); $nextTile = array_shift($arrayedText); // 如果需要遇到STRING_END就停止,可以在这里加判断 if ($firstTile == STRING_END || $nextTile == STRING_END) { break; } if($firstTile == $nextTile){ //若两张骨牌相同 $doubleTiles = true; printTiles($firstTile, $nextTile); //调用函数在页面打印骨牌 } }
关键修改说明
- 成对取出元素:每次循环连续调用两次
array_shift(),直接取出当前配对的两个元素,这样数组会自动跳到下一对元素的起始位置,彻底避免重复处理。 - 安全的循环条件:用
count($arrayedText) >= 2作为循环条件,确保每次循环都能拿到一对元素,不会触发索引越界错误。 - 类型匹配:把
STRING_END的定义改为字符串"7",和explode()生成的数组元素类型保持一致,避免类型不匹配的比较问题。 - 可选的终止判断:如果需要遇到
7就立即停止循环,可以在取出元素后加入判断并break,根据你的需求灵活调整。
这样修改后,代码就会正确完成[0]&[1]、[2]&[3]、[4]&[5]这类成对比较,不会再出现重复处理元素的问题。
内容的提问来源于stack exchange,提问作者Kolya_EP
相关产品推荐
相关产品推荐

