场景
从数据库得到图片的名称为 第1-2页.jpg,第2-3页.jpg…..或 第1页,第2页…,因为图片是批量上传的,在数据库中并没有排序,现在须根据取出的数组按数字顺序从小到大进行排序
思路
参考下图模拟记录。可以提取出名字里面的数字作为排序的标识。第3-4页可以变成数字3,后面同理,组有一个数组做为array_multisort($arr1,$arr2)
的第一项,再在原数组里加一个sort的键记录这个数字。把新的数组作为第二个参数。就可实现以上场景的排序了。
根据字段name的排序规则提取出一个排序数组(规定第一个数字为排序的元素,通过匹配在原数组中加入多一个字段做排序的项)。
取出排序因子所组成的数组
array_multisort()的用法:
定义:array_multisort()可以用来一次对多个数组进行排序,或者根据某一维或多维对多维数组进行排序。
1.对多个一维数组进行排序
$num1 = [3,5,4,3];
$num2 = [26,54,34,76];
array_multisort($num1,SORT_ASC,$num2,SORT_DESC)
print_r($num1);
print_r($num2);
2,对多维数组排序
$arr = array(
'0' => array(
'num1' => 3,
'num2' => 27
),
'1' => array(
'num1' => 5,
'num2' => 50
),
'2' => array(
'num1' => 4,
'num2' => 44
),
'3' => array(
'num1' => 3,
'num2' => 78
)
);
/*foreach ( $arr as $key => $row ){
$num1[$key] = $row ['num1'];
$num2[$key] = $row ['num2'];
}*/
//
$num1 = array_column($arr, 'num1');
$num2 = array_column($arr, 'num2');
//先以$num1按升序排,如如相同再按$num2倒序
array_multisort($num1, SORT_ASC, $num2, SORT_DESC, $arr);
print_r($arr);
完整代码:
<?php
//模拟数据库里取出的数据
$data = [
[
'id' => 1,
'name'=> '第3-4页.jpg',
'url' => 'www.xxx.com/xxx/xxx.jpg'
],
[
'id' => 2,
'name'=> '第5-6页.jpg',
'url' => 'www.xxx.com/xxx/xxx.jpg'
],
[
'id' => 3,
'name'=> '第11-12页.jpg',
'url' => 'www.xxx.com/xxx/xxx.jpg'
],
[
'id' => 4,
'name'=> '第1-2页.jpg',
'url' => 'www.xxx.com/xxx/xxx.jpg'
],
[
'id' => 5,
'name'=> '第7-8页.jpg',
'url' => 'www.xxx.com/xxx/xxx.jpg'
],
[
'id' => 6,
'name'=> '第9-10页.jpg',
'url' => 'www.xxx.com/xxx/xxx.jpg'
]
];
//取文件名第一个数字做排序依据
foreach($data as $k=>&$v){
preg_match('/(\d+)/', $v['name'], $match);
$v['sort'] = $match[1];
}
$sort_value = array_column($data, 'sort');
array_multisort($sort_value, $data);
echo '<pre>';
print_r($data);
最终输出结果为: