首页 > 解决方案 > 如何按具有未知索引的子数组值对数组进行排序

问题描述

我有这个 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,
        ];

?>

谢谢

标签: phparrayssorting

解决方案


我会从创建一个新数组开始,它以每个城市的最低价格作为价值

为此,我使用了一个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


推荐阅读