由于为朋友做另外一个主题,其中涉及到一个后台项目排序的问题:将同一分类的项目排在一起,分类按从大到小排列;每个分类的各个项目又有排序,按序号从小到大排列。经过多次的实验,最终解决了这一问题。
PHP的排序函数(sort)有很多,但要实现该功能,还需要灵活运用,为了让程序便于理解,我把程序复杂化了,用了一种原始老土的办法顺利实现其算法。首先我们给出一个混乱的数组,如下:
$test = array( array( 'cat' => 20, 'order' => 0 ), array( 'cat' => 12, 'order' => 4 ), array( 'cat' => 20, 'order' => 3 ), array( 'cat' => 20, 'order' => 1 ), array( 'cat' => 12, 'order' => 0 ) )
我们自己可以观察出,一共有两个分组“20,12”,且分组内还有不同顺序的排序。我们的思路如下:
1、先将数组按照分类进行排序,将同一分类的元素放在一起,分类按从大到小排;
2、引入一个临时数组变量,将同一分类的所有元素作为一个数组赋给临时变量数组的一个元素,这样,临时数组就只有两个元素,每个元素是一个数组,这个数组内的元素的cat值都相同;
3、遍历临时数组,对由有相同cat值组成的数组进行如1中一样的排序,只不过排序的依据变为了order值;
4、在重新遍历临时数组,通过两层foreach把经过调序后的元素重新赋值给原数组。
接下来我们就来看看PHP程序如何实现这个算法:
function sort_cat($a,$b){ return ($a['cat'] > $b['cat']) ? -1 : 1; } usort($test,'sort_cat'); // 上面实现第1步 $tmpArray = array(); foreach($test as $key => $t){ $tmpArray[$t['cat']][] = $t; } // 上面实现第2步 function sort_order($a,$b){ return ($a['order'] < $b['order']) ? -1 : 1; } foreach($tmpArray as $key => $tmp){ usort($tmpArray[$key],'sort_order'); } // 上面实现第3步 $test = array(); foreach($tmpArray as $tmp){ foreach($tmp as $t)$test[] = $t; } // 上面实现第4步 unset($tmpArray);
这种思路总觉得比较繁杂,foreach出现的次数过多,不仅代码不够美观,而且可能影响程序运行的效率。如果您有更好的思路,请在文后参与讨论。