php - 如何按具有未知索引的子数组值对数组进行排序
问题描述
我有这个 PHP 数组:
<?php
$cities = [
'amsterdam' => $amsterdam,
'prague' => $prague,
'lisboa' => $lisboa
];
$amsterdam = [
65 => [
'table' => Object
'something' => false,
'data' => [
'foo' => 'boo',
'price' => 100
]
],
173 => [
'table' => Object
'something' => false,
'data' => [
'foo' => 'hoo',
'price' => 2500
]
],
...
];
$prague = [
132 => [
'table' => Object
'something' => false,
'data' => [
'foo' => 'boo',
'price' => 2100
]
],
956 => [
'table' => Object
'something' => false,
'data' => [
'foo' => 'hoo',
'price' => 2500
]
],
...
];
$lisboa = [
175 => [
'table' => Object
'something' => false,
'data' => [
'foo' => 'boo',
'price' => 6500
]
],
64 => [
'table' => Object
'something' => false,
'data' => [
'foo' => 'hoo',
'price' => 20
]
],
...
];
?>
我需要按子数组值 ['data']['price'] 对其进行排序,所以输出是这样的:
<?php
$cheapest_cities [
'lisboa' => $lisboa, // because 64->data->price is 20
'amsterdam' => $amsterdam, // beacuse 65->data->price is 100
'prague' => $prague // bacause 132->data->price is 2100
];
?>
我尝试了几种 usort 组合,但问题是,在我的示例中,我永远不知道子数组索引是什么(65、173、132、956、175、64)。
你知道如何排序吗?
数据来自数据库:
<?php
$amsterdam = $this->getTable()->where(['package_id' => [1,2,3]])->order('package_id')->fetchPairs('id');
$lisboa = $this->getTable()->where(['package_id' => [4,5]])->order('package_id')->fetchPairs('id');
$prague = $this->getTable()->where(['package_id' => [6]])->order('package_id')->fetchPairs('id');
return [
'amsterdam' => $amsterdam,
'lisboa' => $lisboa,
'prague' => $prague,
];
?>
谢谢
解决方案
我会从创建一个新数组开始,它以每个城市的最低价格作为价值
为此,我使用了一个array_map
将 $items 降低到价格的函数array_reduce
$map_prices = function($n) {
$reduce_smallest_price = function($carry, $item) {
return $item['data']['price'] < $carry
? $item['data']['price']
: $carry;
};
return array_reduce($n, $reduce_smallest_price, INF);
};
$cities_price = array_map($map_prices, $cities);
asort($cities_price);
我使用这个价格数组对原始数组进行排序uksort
uksort($cities, function($a, $b) {
global $cities_price;
return strnatcmp($cities_price[$a], $cities_price[$b]);
});
这是一个关于 3v4l 的实时示例:https ://3v4l.org/8B9VN
推荐阅读
- jquery - Angular 6 - 集成 jQuery/JavaScript 文件
- c# - 如何在实现类似于 reddits 帖子排序的功能时避免切换大小写
- c# - “浮动”的最大值是多少?
- powerbi - 更新度量计算以在 DAX 中应用 OR 逻辑
- python - 在为简单理解创建变量时, int 和 .strip() 的唯一目的是什么?
- php - WordPress:不能在 PHP 回显行中包含自定义帖子类型循环(使用 ACF 的“the_field”)
- php - 如何在 Gmail 中发送消息 ID 批量修改 php 客户端库中的 API 调用
- java - 有没有办法按文件类型指定最大文件大小?
- macos - WebStorm 中缺少创建命令行启动器
- npm - 如何使用 VS Code 调试 npm 本身(不是我的代码)?