PHP8中不使用内置函数查找数组首字母序元素的代码错误排查
原代码的错误分析及修正方案
你写的代码存在两个核心错误:
内层循环起始索引错误
原代码内层循环从$j = 1开始,这会导致每次外层循环的$i都会和数组里所有元素(包括$i之前已经处理过的元素)重复对比交换,逻辑完全混乱。正确的做法是让$j从$i + 1开始,这样每个元素只和后面未比较过的元素对比,避免无意义的重复操作。字符串比较逻辑搞反
strcmp($a, $b)的规则是:如果$a按字母顺序排在$b前面,返回负数;相等返回0;$a在$b后面返回正数。原代码里判断strcmp($arraystring[$i], $arraystring[$j]) < 0时就交换元素,这相当于把更靠前的元素往后挪,最终数组会变成降序排列,第一个元素会是最大的(比如示例里的"This"),完全不符合你要找最小元素的需求。正确的判断应该是当strcmp($arraystring[$i], $arraystring[$j]) > 0时交换,这样能把更小的元素逐步换到前面。
修正后的排序版代码(能得到正确的最小元素)
$arraystring = array("This","is","my","apple"); $count = count($arraystring); for ($i = 0; $i < $count; $i++) { // 内层循环从i+1开始,避免重复比较 for ($j = $i + 1; $j < $count; $j++) { // 当i位置元素比j位置大时交换,把小的放前面 if(strcmp($arraystring[$i], $arraystring[$j]) > 0){ $temp = $arraystring[$i]; $arraystring[$i] = $arraystring[$j]; $arraystring[$j] = $temp; } } } echo $arraystring[0]; // 输出apple
更高效的方案(无需排序,直接找最小元素)
其实你不需要给整个数组排序,只需要一次遍历就能找到最小元素,效率更高:
$arraystring = array("This","is","my","apple"); $count = count($arraystring); if ($count === 0) { echo "数组为空"; exit; } // 初始化最小元素为数组第一个元素 $minStr = $arraystring[0]; for ($i = 1; $i < $count; $i++) { // 如果当前元素比记录的最小元素更靠前,更新最小元素 if (strcmp($arraystring[$i], $minStr) < 0) { $minStr = $arraystring[$i]; } } echo $minStr; // 输出apple
内容的提问来源于stack exchange,提问作者Dev hub
相关产品推荐
相关产品推荐

