PHP校验首个字符串所有字符是否存在于第二个字符串的代码异常排查及修复请求
问题排查与修复方案
首先,咱们来搞清楚为什么测试$str1和$str2都是"jenny"时会输出错误结果:
错误原因分析
你的代码逻辑里,对于$str1中的每个字符,会遍历$str2的所有字符每找到一次匹配就往$ch_check数组里添加一次该字符。拿"jenny"这个例子来说:
$str1里的第3个字符是'n',在$str2里能找到两次匹配,所以会往数组里加两次'n'$str1里的第4个字符又是'n',同样会在$str2里找到两次匹配,再加两次'n'
最终$ch_check数组的长度是7,而strlen($str1)是5,两者不相等,自然就输出了"Nope :("。
修复方案
这里给你三种可行的修复方式,你可以根据需求选择:
方案1:修复原有循环逻辑
核心是找到匹配后立刻停止内层循环,确保每个$str1的字符只被记录一次:
<?php if(!empty($_POST["send"])){ // 仅在点击名为"send"的提交按钮时执行代码 $str1 = $_POST["str1"]; $str2 = $_POST["str2"]; $ch_check = []; for($i = 0; $i < strlen($str1); $i++){ $ch = $str1[$i]; $isFound = false; // 遍历$str2找匹配,找到后立刻跳出内层循环 for($j = 0; $j < strlen($str2); $j++){ if($ch == $str2[$j]){ $isFound = true; break; } } if($isFound){ $ch_check[] = $ch; } } if(count($ch_check) == strlen($str1)){ echo "Bingo!"; }else{ echo "Nope :("; } } ?>
方案2:利用PHP内置函数strpos简化逻辑
strpos可以快速判断字符是否存在于字符串中,代码会更简洁:
<?php if(!empty($_POST["send"])){ $str1 = $_POST["str1"]; $str2 = $_POST["str2"]; $allCharsExist = true; for($i = 0; $i < strlen($str1); $i++){ $ch = $str1[$i]; // 用strpos检查字符是否存在,注意===false的判断(避免字符在位置0的情况) // 如果需要不区分大小写,把strpos改成stripos即可 if(strpos($str2, $ch) === false){ $allCharsExist = false; break; // 发现不存在的字符就立刻终止循环 } } echo $allCharsExist ? "Bingo!" : "Nope :("; } ?>
方案3:用数组优化查找效率
如果处理的字符串较长,这种方式的查找速度会更快:
<?php if(!empty($_POST["send"])){ $str1 = $_POST["str1"]; $str2 = $_POST["str2"]; // 把$str2拆成字符数组,翻转后用字符作为键,实现O(1)时间复杂度的查找 $str2CharMap = array_flip(str_split($str2)); $allCharsExist = true; foreach(str_split($str1) as $ch){ if(!isset($str2CharMap[$ch])){ $allCharsExist = false; break; } } echo $allCharsExist ? "Bingo!" : "Nope :("; } ?>
内容的提问来源于stack exchange,提问作者green555
相关产品推荐
相关产品推荐

