经常需要根据嵌套数组中的某个值进行排序,例如新闻列表的id倒叙、发布时间倒序排列等。这里有两种方法。
使用array_multisort
函数来排序
array_multisort()
可以用来一次对多个数组进行排序,或者根据某一维或多维对多维数组进行排序。
关联(string)键名保持不变,但数字键名会被重新索引。
成功时返回 TRUE, 或者在失败时返回 FALSE。
<?php
$news = [
['id' => 1, 'title' => '标题1', 'publish_at' => '2020-02-18 14:00:00'],
['id' => 2, 'title' => '标题2', 'publish_at' => '2020-02-18 15:00:00'],
['id' => 3, 'title' => '标题3', 'publish_at' => '2020-02-18 16:00:00']
];
//取出数组中id的一列,返回一维数组
// $news_key 结果:[1,2,3]
$news_key = array_column($news, 'id');
// 排序,根据$news_key排序,不用重新赋值
// 结果是$news按照id的值倒序排列。
array_multisort($news_key, SORT_DESC, $news);
print_r($news);
结果:
Array
(
[0] => Array
(
[id] => 3
[title] => 标题3
[publish_at] => 2020-02-18 16:00:00
)
[1] => Array
(
[id] => 2
[title] => 标题2
[publish_at] => 2020-02-18 15:00:00
)
[2] => Array
(
[id] => 1
[title] => 标题1
[publish_at] => 2020-02-18 14:00:00
)
)
两个数组要有相同个数的元素。第二个数组里的项目对应第一个数组后也进行了排序,对应关系不会断。此例是按照第一个数组倒序排列,每个元素对应的第二个数组元素也跟着变化顺序了。
使用uasort
自定义函数排序
使用用户自定义的比较函数对数组中的值进行排序。还有usort
。
成功时返回 TRUE, 或者在失败时返回 FALSE。
<?php
$news = [
['id' => 1, 'title' => '标题1', 'publish_at' => '2020-02-18 14:00:00'],
['id' => 2, 'title' => '标题2', 'publish_at' => '2020-02-18 15:00:00'],
['id' => 3, 'title' => '标题3', 'publish_at' => '2020-02-18 16:00:00']
];
// 按日期从大到小排序(倒叙),其实也可以不用转换成时间戳
uasort($news, function($x, $y){return strtotime($x['publish_at']) <= strtotime($y['publish_at']);});
print_r($news);
参考
https://www.php.net/uasort
https://www.php.net/array_multisort