如何不使用sort或asort函数将数组升序后存入另一个数组?
如何将数组升序排序后写入另一个数组
最简单的解决方案:使用PHP内置排序函数
PHP内置了高效的排序函数,完全可以满足需求,不需要自己写复杂的循环逻辑:
$data = [3, 4, 54, 7, 9, 34, 5, 6, 7, 3, 5]; // 复制原数组到新数组,避免修改原数组内容 $res1 = $data; // 对新数组执行升序排序(sort函数会直接修改目标数组) sort($res1); // 输出排序后的结果 foreach ($res1 as $num) { echo $num . ' / '; }
执行后输出:3 / 3 / 4 / 5 / 5 / 6 / 7 / 7 / 9 / 34 / 54 /
你的代码存在的问题
你自己写的嵌套循环有几个明显错误:
- 修改原数组导致循环混乱:循环中使用
array_shift($data)直接修改原数组,count($data)的值会不断减小,外层循环的$i和数组实际长度不匹配,最终导致元素被跳过或重复处理。 - 判断逻辑不完整:代码只把比
$data[$i]小的元素加入新数组,既没处理等于当前元素的情况,也没将$data[$i]本身加入新数组,最终会丢失大量元素。 - 索引偏移问题:原数组被
array_shift修改后索引重排,后续循环中$data[$i]指向的元素已不是初始值,逻辑完全混乱。
自定义排序实现(如果不想用内置函数)
如果想手动实现排序逻辑,比如冒泡排序,可以这样写:
$data = [3, 4, 54, 7, 9, 34, 5, 6, 7, 3, 5]; $res1 = $data; $length = count($res1); // 冒泡排序:通过相邻元素比较交换,逐步将最大元素移到末尾 for ($i = 0; $i < $length - 1; $i++) { for ($j = 0; $j < $length - $i - 1; $j++) { if ($res1[$j] > $res1[$j + 1]) { // 交换两个元素的位置 $temp = $res1[$j]; $res1[$j] = $res1[$j + 1]; $res1[$j + 1] = $temp; } } } // 输出结果 foreach ($res1 as $num) { echo $num . ' / '; }
内容的提问来源于stack exchange,提问作者Tsimbina Thrimoson
相关产品推荐
相关产品推荐

