查看: 4171|回复: 0

php多维数组排序

74

主题

77

帖子

425

积分

站长

Rank: 9Rank: 9Rank: 9

积分
425
重点:
对于二维数组排序,可以array_column和array_multisort合起来用。
用array_column提取出某一列的值。用array_multisort进行综合排序。
以下是解释二个函数。
1.二维数组,提取某一列的值
array_column
(PHP 5 >= 5.5.0, PHP 7, PHP 8)
array_column — 返回输入数组中指定列的值
说明
[PHP] 纯文本查看 复制代码
array_column(array $array, int|string|null $column_key, int|string|null $index_key = null): array

array_column() 返回 array 中键名为 column_key 的一列值。 如果指定了可选参数 index_key,则使用输入数组中 index_key 列的值将作为返回数组中对应值的键。
参数
array
多维数组或对象数组,从中提取一列值。 如果提供的是对象数组,只有 public 的属性会被直接取出。 如果想取出 private 和 protected 的属性,类必须实现 __get() 和 __isset() 魔术方法。
column_key
需要返回值的列。它可以是索引数组的列索引,或者是关联数组的列的键,也可以是属性名。 也可以是 null ,此时将返回整个数组(配合 index_key 参数来重新索引数组时非常好用)。
index_key
作为返回数组的索引/键的列。它可以是该列的整数索引,或者字符串键值。 该值会像数组键一样被 强制转换 (但是,在 PHP 8.0.0 之前,也被允许支持转换为字符串对象)。
返回值
返回输入数组中单列值的数组。
[PHP] 纯文本查看 复制代码
<?php
    // 表示从数据库返回的记录集的数组
    $records = array(
        array(
            'id' => 2135,
            'first_name' => 'John',
            'last_name' => 'Doe',
        ),
        array(
            'id' => 3245,
            'first_name' => 'Sally',
            'last_name' => 'Smith',
        ),
        array(
            'id' => 5342,
            'first_name' => 'Jane',
            'last_name' => 'Jones',
        ),
        array(
            'id' => 5623,
            'first_name' => 'Peter',
            'last_name' => 'Doe',
        )
    );
    $first_names = array_column($records, 'first_name');
    print_r($first_names);
    ?>

输出
  
[PHP] 纯文本查看 复制代码
  Array
    (
        [0] => John
        [1] => Sally
        [2] => Jane
        [3] => Peter
    )


示例 #2 从结果集中总取出 last_name 列,用相应的“id”作为键值
   
[PHP] 纯文本查看 复制代码
 <?php
    // 使用示例 #1 中的 $records 数组
    $last_names = array_column($records, 'last_name', 'id');
    print_r($last_names);
    ?>

输出:
[PHP] 纯文本查看 复制代码
    Array
    (
        [2135] => Doe
        [3245] => Smith
        [5342] => Jones
        [5623] => Doe
    )

array_multisort
(PHP 4, PHP 5, PHP 7, PHP 8)
array_multisort — 对多个数组或多维数组进行排序
说明
[PHP] 纯文本查看 复制代码
[mw_shl_code=php,true]array_multisort(
    array &$array1,
    mixed $array1_sort_order = SORT_ASC,
    mixed $array1_sort_flags = SORT_REGULAR,
    mixed $... = ?
): bool
[/mw_shl_code]
array_multisort() 可以用来一次对多个数组进行排序,或者根据某一维或多维对多维数组进行排序。
关联(string)键名保持不变,但数字键名会被重新索引。
注意:
如果两个成员完全相同,那么它们在排序数组中的相对顺序是未定义的。
参数
array1
要排序的 array。
array1_sort_order
之前 array 参数要排列的顺序。 SORT_ASC 按照上升顺序排序, SORT_DESC 按照下降顺序排序。
此参数可以和 array1_sort_flags 互换,也可以完全删除,默认是 SORT_ASC 。
array1_sort_flags
为 array 参数设定选项:
排序类型标志:
    SORT_REGULAR - 将项目按照通常方法比较(不修改类型)
    SORT_NUMERIC - 按照数字大小比较
    SORT_STRING - 按照字符串比较
    SORT_LOCALE_STRING - 根据当前的本地化设置,按照字符串比较。 它会使用 locale 信息,可以通过 setlocale() 修改此信息。
    SORT_NATURAL - 以字符串的"自然排序",类似 natsort()
    SORT_FLAG_CASE - 可以组合 (按位或 OR) SORT_STRING 或者 SORT_NATURAL 大小写不敏感的方式排序字符串。
参数可以和 array1_sort_order 交换或者省略,默认情况下是 SORT_REGULAR。
...
可选的选项,可提供更多数组,跟随在 sort order 和 sort flag 之后。 提供的数组和之前的数组要有相同数量的元素。 换言之,排序是按字典顺序排列的。
返回值 ¶
成功时返回 true, 或者在失败时返回 false。
数据全都存放在名为 data 的数组中。这通常是通过循环从数据库取得的结果,例如 mysql_fetch_assoc()。
[PHP] 纯文本查看 复制代码
 <?php
    $data[] = array('volume' => 67, 'edition' => 2);
    $data[] = array('volume' => 86, 'edition' => 1);
    $data[] = array('volume' => 85, 'edition' => 6);
    $data[] = array('volume' => 98, 'edition' => 2);
    $data[] = array('volume' => 86, 'edition' => 6);
    $data[] = array('volume' => 67, 'edition' => 7);
    ?> 

本例中将把 volume 降序排列,把 edition 升序排列。
现在有了包含有行的数组,但是 array_multisort() 需要一个包含列的数组,因此用以下代码来取得列,然后排序。
[PHP] 纯文本查看 复制代码
<?php
    // 取得列的列表
    foreach ($data as $key => $row) {
        $volume[$key]  = $row['volume'];
        $edition[$key] = $row['edition'];
    }
// 将数据根据 volume 降序排列,根据 edition 升序排列
// 把 $data 作为最后一个参数,以通用键排序
array_multisort($volume, SORT_DESC, $edition, SORT_ASC, $data);
?> 

数据集合现在排好序了,结果如下:
volume | edition
-------+--------
    98 |       2
    86 |       1
    86 |       6
    85 |       6
    67 |       2
    67 |       7
————————————————
版权声明:本文为CSDN博主「fridayCodeFly」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/kfei666/article/details/122428581
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

部分素材来源于网络,如有侵权请联系www@benzou.cn进行删除。
Copyright   ©2016-2024  重庆奔走科技有限公司  Powered by © benzou.cn / benzou.cc
快速回复 返回列表 返回顶部