【问题标题】:PHP sort array with custom order具有自定义顺序的 PHP 排序数组
【发布时间】:2020-05-29 15:11:49
【问题描述】:

我知道这个问题并不新鲜,但我没有找到解决方案。我有一个返回 JSON 的 API 请求:

$values = '{"retcode" : "0 Done", 
            "trans_id" : "326678", 
            "answer" : [ { "City" : "New York", "Digits" : "5", "Datetime" : "1590773203", "DatetimeMsc" : "1590773203568", "Value" : "0.66480", "Average" : "0.66485", "Last" : "0.00000", "Volume" : "0", "VolumeReal" : "0" 
                    } , { "City" : "Berlin","Digits" : "5", "Datetime" : "1590773203", "DatetimeMsc" : "1590773203568", "Value" : "0.89917", "Average" : "0.89920", "Last" : "0.00000", "Volume" : "0", "VolumeReal" : "0" 
                    } , { "City" : "Paris", "Digits" : "3", "Datetime" : "1590773203", "DatetimeMsc" : "1590773203569", "Value" : "119.680", "Average" : "119.684", "Last" : "0.000", "Volume" : "0", "VolumeReal" : "0" 
                    } , { "City" : "Athens", "Digits" : "5", "Datetime" : "1590773203", "DatetimeMsc" : "1590773203569", "Value" : "1.11211", "Average" : "1.11213", "Last" : "0.00000", "Volume" : "0", "VolumeReal" : "0" 
                    } , { "City" : "Beijing", "Digits" : "5", "Datetime" : "1590773203", "DatetimeMsc" : "1590773203568", "Value" : "1.23677", "Average" : "1.23686", "Last" : "0.00000", "Volume" : "0", "VolumeReal" : "0" 
                    } , { "City" : "Moscow", "Digits" : "5", "Datetime" : "1590773203", "DatetimeMsc" : "1590773203167", "Value" : "1.37647", "Average" : "1.37654", "Last" : "0.00000", "Volume" : "0", "VolumeReal" : "0" 
                    } , { "City" : "Tokyo", "Digits" : "3", "Datetime" : "1590773203", "DatetimeMsc" : "1590773203370", "Value" : "107.616", "Average" : "107.619", "Last" : "0.000", "Volume" : "0", "VolumeReal" : "0" 
                    } , { "City" : "Melbourne", "Digits" : "2", "Datetime" : "1590773203", "DatetimeMsc" : "1590773203569", "Value" : "11622.15", "Average" : "11622.95", "Last" : "0.00", "Volume" : "0", "VolumeReal" : "0" 
                    } , { "City" : "Amman", "Digits" : "2", "Datetime" : "1590773203", "DatetimeMsc" : "1590773203370", "Value" : "3017.30", "Average" : "3017.70", "Last" : "0.00", "Volume" : "0", "VolumeReal" : "0" 
                    } , { "City" : "Chicago", "Digits" : "2", "Datetime" : "1590773203", "DatetimeMsc" : "1590773203569", "Value" : "25261.20", "Average" : "25262.70", "Last" : "0.00", "Volume" : "0", "VolumeReal" : "0" 
                    } , { "City" : "Los Angeles", "Digits" : "2", "Datetime" : "1590773203", "DatetimeMsc" : "1590773203772", "Value" : "9408.10", "Average" : "9409.00", "Last" : "0.00", "Volume" : "0", "VolumeReal" : "0" 
                    } , { "City" : "Madrid", "Digits" : "3", "Datetime" : "1590773203", "DatetimeMsc" : "1590773203772", "Value" : "33.623", "Average" : "33.663", "Last" : "0.000", "Volume" : "0", "VolumeReal" : "0" 
                    } , { "City" : "Rome", "Digits" : "2", "Datetime" : "1590773203", "DatetimeMsc" : "1590773203370", "Value" : "1731.83", "Average" : "1732.06", "Last" : "0.00", "Volume" : "0", "VolumeReal" : "0" 
                    } ] }';

我将 JSON 转换为一个数组,并创建一个具有自定义顺序的数组,具体取决于城市

$values=json_decode($values, true);
$order = array('Rome', 'Berlin', 'Tokyo','Beijing',
                'New York','Athens','Moscow','Los Angeles',
                'Paris','Madrid','Chicago','Melbourne','Amman');                
usort($values, function ($a, $b) use ($order) {
    $pos_a = array_search($a['City'], $order);
    $pos_b = array_search($b['City'], $order);
    return $pos_a - $pos_b;
});
var_dump($values);

此代码返回与 json_decode 之后相同的数组。有什么建议么?提前致谢。

【问题讨论】:

  • 因为城市在$values['answer'],而不是$values

标签: php arrays sorting


【解决方案1】:

只需在 usort 函数中将数组 $values 更改为 $values['answer']

$values=json_decode($values, true);
$order = array('Rome', 'Berlin', 'Tokyo','Beijing',
                'New York','Athens','Moscow','Los Angeles',
                'Paris','Madrid','Chicago','Melbourne','Amman');    
usort($values['answer'], function ($a, $b) use ($order) {
    $pos_a = array_search($a['City'], $order);
    $pos_b = array_search($b['City'], $order);
    return $pos_a - $pos_b;
});

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-06-24
    • 1970-01-01
    • 2014-04-01
    • 2017-07-06
    • 1970-01-01
    相关资源
    最近更新 更多