array_multisort详解及场景应用

场景

从数据库得到图片的名称为 第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);

最终输出结果为:

这里写图片描述

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值