PHP半数值数组选择排序无效,请求排查与修复方案
问题分析与修复方案
首先,你的代码里有两个关键问题导致数组排序后没有变化,咱们一步步拆解解决:
1. 变量名拼写错误
你调用排序函数时写了:
recursiveSelectionSort($myarray, sizeof($mayarry));
这里的$mayarry是拼写错误,应该是$myarray——这个小错误会让函数拿到错误的数组长度,排序逻辑根本没法正常执行。
2. PHP数组的传递方式问题
PHP里默认参数是值传递,也就是说你的recursiveSelectionSort函数里操作的是原数组的一个副本,不管你在函数里怎么交换元素,原数组都不会受到任何影响。要让函数能直接修改原数组,必须把数组参数改成引用传递。
修改后的完整代码
我们需要给minIndex和recursiveSelectionSort函数的数组参数加上&符号,改成引用传递:
function getScoreValue($row) { return (int)(explode(",", $row)[2]); } // 数组参数改为引用传递 function minIndex(&$ma, $mi, $mj) { if ($mi == $mj) { return $mi; } $k = minIndex($ma, $mi + 1, $mj); if (getScoreValue($ma[$mi]) < getScoreValue($ma[$k])) { return $mi; } else { return $k; } } // 数组参数改为引用传递 function recursiveSelectionSort(&$ma, $mn, $mindex = 0) { if ($mindex == $mn) { return; } $k = minIndex($ma, $mindex, $mn - 1); if ($k != $mindex) { $temp = $ma[$k]; $ma[$k] = $ma[$mindex]; $ma[$mindex] = $temp; } recursiveSelectionSort($ma, $mn, $mindex + 1); }
然后正确调用函数:
recursiveSelectionSort($myarray, sizeof($myarray));
这样修改后,递归排序就能正确修改原数组,按照score列完成排序了。
额外建议:用PHP内置函数简化实现
其实PHP已经提供了更简洁的内置排序函数usort,完全可以替代自己写的递归排序,代码更简洁还不容易出错:
usort($myarray, function($a, $b) { $scoreA = (int)explode(",", $a)[2]; $scoreB = (int)explode(",", $b)[2]; return $scoreA - $scoreB; // 升序排序,要降序就改成$scoreB - $scoreA });
内容的提问来源于stack exchange,提问作者user9665770
相关产品推荐
相关产品推荐

