乌徒帮技术范WEB开发PHP › PHP根据数组元素不同的值进行分组排序的一种思路

PHP根据数组元素不同的值进行分组排序的一种思路

分类:PHP 标签:

由于为朋友做另外一个主题,其中涉及到一个后台项目排序的问题:将同一分类的项目排在一起,分类按从大到小排列;每个分类的各个项目又有排序,按序号从小到大排列。经过多次的实验,最终解决了这一问题。

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出现的次数过多,不仅代码不够美观,而且可能影响程序运行的效率。如果您有更好的思路,请在文后参与讨论。

填写个人信息,赶快回复吧!