$age=array("Elon"=>"47","Bill"=>"56","A"=>"56");
arsort($age); // 结果:$age == ["A"=>"56", "Bill"=>"56", "Elon"=>"47"] <=== 注意看这行代码
asort($age); // 结果:$age == ["Elon"=>"47", "A"=>"56", "Bill"=>"56"]
arsort($age); // 结果:$age == ["Bill"=>"56", "A"=>"56", "Elon"=>"47"] <=== 以及这行代码
代码如上。为什么第一次调用 arsort() 与 第二次调用 arsort() 的结果是不一样的呢?
我想要对数组进行降序排序,遇上【键值】大小相同时,各【键名】的位置与其在数组中出现的先后顺序保持一致,这个要自己写排序算法才能实现吗?
PHP
你第二次调用的是 asort 不是 arsort
第二个字母 r 少了。。。。
为了保证"遇上【键值】(即元素值)大小相同时,各【键名】的位置与其在数组中出现的先后顺序保持一致" ,编写了如下对关联数组实施"泡沫排序"的方法的代码。结果似乎达到了楼主的诉求。有关途径叙述如下。
将2维数组排序后得 $arrAges3。但是你忘了必须再将 二维数组 $arrAges3 转变回来, 变成关联数组 $arrAges4。最后,再输出这个 关联数组 $arrAges4。
修改:
将 echo "排序后:<br />"; 之后的所有代码行, 换成以下代码:
注意,在冒泡排序的比较之中,只能用 '<', 而万万不能用 '<='。 这样就保证了键值相等时,不会调换位置,进而保证了 "遇上【键值】大小相同时,各【键名】的位置与其在数组中出现的先后顺序保持一致"。
此外,在冒泡排序的循环之中,应当加上一个布尔变量 $foo,用来监视每次内循环是否有交换发生。若没有交换,说明数组的各个元素已经按降/升序排列完毕,不必再继续"扫描"了。因此就可以立马跳出外循环,结束排序任务。比如用原本就已经排序好的数组作参数,若没有加这个 布尔变量 $foo, 那就要按规定做数次循环、进行比较,这些都是"无用功"。如果有了这个 布尔变量 $foo,那在 第一轮扫描过后,就会发现 $foo 仍然是 FALSE,于是就可以立马停止循环,完成排序。如此这般,免去了后来的不必要的循环操作。特将你的冒泡排序法修改如下, 供参考。