boss 发表于 2023-8-25 12:33:51

php多维数组排序

重点:
对于二维数组排序,可以array_column和array_multisort合起来用。
用array_column提取出某一列的值。用array_multisort进行综合排序。
以下是解释二个函数。
1.二维数组,提取某一列的值
array_column
(PHP 5 >= 5.5.0, PHP 7, PHP 8)
array_column — 返回输入数组中指定列的值
说明
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
    // 表示从数据库返回的记录集的数组
    $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);
    ?>
输出
Array
    (
       => John
       => Sally
       => Jane
       => Peter
    )

示例 #2 从结果集中总取出 last_name 列,用相应的“id”作为键值
    <?php
    // 使用示例 #1 中的 $records 数组
    $last_names = array_column($records, 'last_name', 'id');
    print_r($last_names);
    ?>
输出:
    Array
    (
       => Doe
       => Smith
       => Jones
       => Doe
    )
array_multisort
(PHP 4, PHP 5, PHP 7, PHP 8)
array_multisort — 对多个数组或多维数组进行排序
说明
array_multisort(
    array &$array1,
    mixed $array1_sort_order = SORT_ASC,
    mixed $array1_sort_flags = SORT_REGULAR,
    mixed $... = ?
): bool
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
    $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
    // 取得列的列表
    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
页: [1]
查看完整版本: php多维数组排序