多维数组排序可分为单列排序和嵌套排序。单列排序可使用 array_multisort() 函数按列排序;嵌套排序需要递归函数遍历数组并排序。实战案例包括按产品名称排序和按销售量和价格复合
多维数组排序可分为单列排序和嵌套排序。单列排序可使用 array_multisort() 函数按列排序;嵌套排序需要递归函数遍历数组并排序。实战案例包括按产品名称排序和按销售量和价格复合排序。
PHP 数组多维排序实战:从简单到复杂场景
引言
在 PHP 中,对多维数组进行排序通常是一项复杂的任务。本教程将引导你逐步了解如何根据不同的场景进行多维数组排序,从简单的单列排序到复杂的嵌套排序。
单列排序
最简单的多维数组排序是根据单列进行排序。你可以使用 array_multisort()
函数:
$arr = [
['id' => 1, 'name' => 'John Doe'],
['id' => 3, 'name' => 'Jane Smith'],
['id' => 2, 'name' => 'Bob Johnson'],
];
array_multisort(array_column($arr, 'id'), SORT_ASC, $arr);
print_r($arr);
// 输出:
// Array
// (
// [0] => Array
// (
// [id] => 1
// [name] => John Doe
// )
// [1] => Array
// (
// [id] => 2
// [name] => Bob Johnson
// )
// [2] => Array
// (
// [id] => 3
// [name] => Jane Smith
// )
// )
嵌套数组排序
对于嵌套数组,你需要使用递归函数来遍历数组并对其进行排序:
function sortNestedArray($arr, $col, $order) {
if (!is_array($arr)) {
return $arr;
}
uasort($arr, function($a, $b) use ($col, $order) {
if ($a[$col] == $b[$col]) {
return 0;
}
return ($a[$col] < $b[$col]) ? -1 : 1;
});
foreach ($arr as &$item) {
if (is_array($item)) {
$item = sortNestedArray($item, $col, $order);
}
}
return $arr;
}
实战案例
案例 1:按产品名称对嵌套数组进行排序
$products = [
['id' => 1, 'name' => 'Apple', 'price' => 10],
['id' => 2, 'name' => 'Orange', 'price' => 15],
['id' => 3, 'name' => 'Banana', 'price' => 5],
];
$sortedProducts = sortNestedArray($products, 'name', SORT_ASC);
// ... 处理排序后的数组 ...
案例 2:按销售量和价格对嵌套数组进行复合排序
$salesData = [
['product' => 'Apple', 'count' => 10, 'price' => 10],
['product' => 'Orange', 'count' => 15, 'price' => 15],
['product' => 'Banana', 'count' => 5, 'price' => 5],
];
usort($salesData, function($a, $b) {
if ($a['count'] == $b['count']) {
return ($a['price'] < $b['price']) ? -1 : 1;
}
return ($a['count'] < $b['count']) ? 1 : -1;
});
// ... 处理排序后的数据 ...
--结束END--
本文标题: PHP数组多维排序实战:从简单到复杂场景
本文链接: https://lsjlt.com/news/611112.html(转载时请注明来源链接)
有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341
2024-05-24
2024-05-24
2024-05-24
2024-05-24
2024-05-24
2024-05-24
2024-05-24
2024-05-24
2024-05-24
2024-05-24
回答
回答
回答
回答
回答
回答
回答
回答
回答
回答
0