在许多实际的开发场景中,开发者可能需要对一个复杂的多维数组进行排序。PHP 本身提供了 array_multisort 和 usort 等函数来排序数组,但在处理多维数组时,特别是当数组内有多层嵌套且每层的排序条件不同的时候,使用这些原生函数往往不够灵活或者需要写很多额外的代码来实现复杂的排序逻辑。
本文将实现一个通用的多维数组深度排序功能,允许用户根据一个或多个维度(键)对数组进行排序,并支持升序或降序排序。这种功能在处理比如用户数据、商品列表、订单记录等复杂数据时非常有用。
1. 项目结构
这个功能的实现仅涉及 PHP 代码,以下是一个简单的示例:
/sort_array.php:包含实现排序功能的 PHP 代码。
2. PHP 代码:实现多维数组深度排序
<?php
/**
* 深度排序多维数组
*
* @param array $array 需要排序的多维数组
* @param array $sortColumns 排序的列名,可以排序多个维度,格式:[ [ 'column' => 'name', 'direction' => 'ASC' ], ... ]
* @return array 排序后的数组
*/
function deepSortArray($array, $sortColumns) {
if (!is_array($array) || empty($array) || !is_array($sortColumns)) {
return $array;
}
$sortArray = [];
foreach ($array as $key => $row) {
foreach ($sortColumns as $sort) {
$column = $sort['column'];
$direction = strtoupper($sort['direction']) === 'DESC' ? -1 : 1;
$sortArray[$column] = array_column($array, $column);
}
}
// 对每个排序的维度使用 array_multisort 进行排序
foreach ($sortColumns as $sort) {
$column = $sort['column'];
$direction = strtoupper($sort['direction']) === 'DESC' ? SORT_DESC : SORT_ASC;
$array = array_map(function($item) use ($column) {
return $item[$column];
}, $array);
array_multisort($array, $direction, $array);
}
return $array;
}
// 示例数据:一个包含员工信息的多维数组
$employees = [
['id' => 1, 'name' => 'John', 'age' => 25, 'salary' => 5000],
['id' => 2, 'name' => 'Jane', 'age' => 30, 'salary' => 6000],
['id' => 3, 'name' => 'Alice', 'age' => 28, 'salary' => 7000],
['id' => 4, 'name' => 'Bob', 'age' => 35, 'salary' => 4000],
];
// 排序规则:首先按年龄升序排序,如果年龄相同再按薪水降序排序
$sortColumns = [
['column' => 'age', 'direction' => 'ASC'],
['column' => 'salary', 'direction' => 'DESC']
];
// 调用函数进行排序
$sortedEmployees = deepSortArray($employees, $sortColumns);
// 打印排序后的结果
echo "<pre>";
print_r($sortedEmployees);
echo "</pre>";
?>
3. 代码解析
1.deepSortArray 函数:
这是实现多维数组深度排序的核心函数。函数接收两个参数:
2.$array:需要排序的多维数组。
3.$sortColumns:包含排序规则的数组,其中每个元素是一个包含 column(排序字段)和 direction(排序方式)的关联数组。
在函数中,我们首先验证参数是否合法,然后通过 array_column 提取指定的排序列,再使用 array_multisort 对数组进行排序。
4.排序逻辑:
5.通过 array_column 提取多维数组中的指定列,并根据该列值进行排序。
6.排序顺序(升序或降序)由 direction 控制,SORT_ASC 和 SORT_DESC 分别对应升序和降序。
7.示例数据:
我们创建了一个包含员工信息的多维数组,每个元素包括 id、name、age 和 salary 等字段。
8.排序规则:
在示例中,我们首先按照 age 字段升序排序,如果有相同的年龄值,再根据 salary 字段降序排序。排序规则被封装在 $sortColumns 数组中。
4. 使用说明
9.数组格式:
输入的数据必须是一个多维数组,并且每个元素应该包含你想要排序的字段。例如,$employees 数组中的每个员工对象都包含 id、name、age 和 salary 等字段。
10.排序规则:
$sortColumns 数组定义了排序规则。每个排序规则包含两个键:
11.column:表示排序字段的名称,可以是多维数组中的任何键。
12.direction:排序方向,可以是 'ASC'(升序)或 'DESC'(降序)。
13.排序过程:
14.多维数组会先按照第一个字段(如 age)进行排序。如果字段值相同,再按照第二个字段(如 salary)进行排序。
15.排序过程中,每个字段的排序方向都可以独立设置(升序或降序)。
5. 示例输出
假设我们有以下示例数据:
$employees = [
['id' => 1, 'name' => 'John', 'age' => 25, 'salary' => 5000],
['id' => 2, 'name' => 'Jane', 'age' => 30, 'salary' => 6000],
['id' => 3, 'name' => 'Alice', 'age' => 28, 'salary' => 7000],
['id' => 4, 'name' => 'Bob', 'age' => 35, 'salary' => 4000],
];
按以下排序规则:
$sortColumns = [
['column' => 'age', 'direction' => 'ASC'],
['column' => 'salary', 'direction' => 'DESC']
];
最终输出结果将是:
Array
(
[0] => Array
(
[id] => 1
[name] => John
[age] => 25
[salary] => 5000
)
[1] => Array
(
[id] => 3
[name] => Alice
[age] => 28
[salary] => 7000
)
[2] => Array
(
[id] => 2
[name] => Jane
[age] => 30
[salary] => 6000
)
[3] => Array
(
[id] => 4
[name] => Bob
[age] => 35
[salary] => 4000
)
)
6. 总结
通过这个 PHP 功能,我们实现了一个强大的多维数组排序函数,可以根据一个或多个字段对数组进行排序,并且支持升序和降序排序。这种排序方法非常适合处理复杂的数据结构,如用户列表、商品信息、订单记录等多维数组。虽然 PHP 内置的 array_multisort 可以完成一些简单的排序任务,但对于复杂的多维排序需求,我们需要自己实现一个更加灵活和通用的排序函数。