php多维数组按用户自定义顺序排序uasort()

多维数组如果需要按照某个字段值进行排序,可以尝试array_multisort().但有一个前提,这个字段值的排序是要一定规律的,如字符升序a-z,或者数字降序等等.

现有多维数组如下:
$arr = array(
array(
'id' => 1,
'name' => 'tyr',
'size' => 's',
),
array(
'id' => 2,
'name' => 'aaa',
'size' => 'm',
),
array(
'id' => 3,
'name' => 'aaa',
'size' => 'xl',
),
array(
'id' => 4,
'name' => 'lhf',
'size' => 'l',
),
array(
'id' => 5,
'name' => 'sfd',
'size' => '3xl',
),
);
需要按照服装的尺码大小,由小到大进行排序,尺码如下:
$size=array('xs','s','m','l','xl','xxl','3xl');
此需求如何实现?
可以考虑使用usort系列函数.
快速入门:
 
$num=array(2,3,1);
function myNum($a,$b){//固定格式,$a,$b表示传入数组的子元素
if($a==$b){
return 0;
}
return $a>$b?-1:1;//返回-1表示排在前面,返回1则排在后面
}
usort($num,'myNum');
var_dump($num);
/*结果如下
array(3) {
[0]=>
int(3)
[1]=>
int(2)
[2]=>
int(1)
}
*/
需求实现,如下:
 
function mySort($a,$b){//固定格式
$size=array('xs','s','m','l','xl','xxl','3xl');
$key1=array_search($a['size'],$size);//获取索引值
$key2=array_search($b['size'],$size);
return strnatcmp($key1,$key2);//比较索引值并排序
}
usort($arr,'mySort');
echo '<pre>';
var_dump($arr);
/*
结果如下
array(5) {
[0]=>
array(3) {
["id"]=>
int(1)
["name"]=>
string(3) "tyr"
["size"]=>
string(1) "s"
}
[1]=>
array(3) {
["id"]=>
int(2)
["name"]=>
string(3) "aaa"
["size"]=>
string(1) "m"
}
[3]=>
array(3) {
["id"]=>
int(4)
["name"]=>
string(3) "lhf"
["size"]=>
string(1) "l"
}
[2]=>
array(3) {
["id"]=>
int(3)
["name"]=>
string(3) "aaa"
["size"]=>
string(2) "xl"
}
[4]=>
array(3) {
["id"]=>
int(5)
["name"]=>
string(3) "sfd"
["size"]=>
string(3) "3xl"
}
}
*/
扩展:如何在类(class)中调用自定义的函数
 
class Mysort{
public function sortFunc($arr){
uasort($arr,array($this,'mySort'));
return $arr;
}
 
public function mySort($a,$b){//固定格式
$size=array('xs','s','m','l','xl','xxl','3xl');
$key1=array_search($a['size'],$size);//获取索引值
$key2=array_search($b['size'],$size);
return strnatcmp($key1,$key2);//比较索引值并排序
}
}
 
$arr = array(
array(
'id' => 1,
'name' => 'tyr',
'size' => 's',
),
array(
'id' => 2,
'name' => 'aaa',
'size' => 'm',
),
array(
'id' => 3,
'name' => 'aaa',
'size' => 'xl',
),
array(
'id' => 4,
'name' => 'lhf',
'size' => 'l',
),
array(
'id' => 5,
'name' => 'sfd',
'size' => '3xl',
),
);
$obj=new Mysort();
$res=$obj->sortFunc($arr);
即,传入array(调用对象,自定义函数名称).
 

posted on 2015-03-22 12:27  一斤奋斗  阅读(477)  评论(0编辑  收藏  举报

导航