繁体   English   中英

如何使用PHP中的键对数组值进行排序

[英]How to sort array value using the key in PHP

我需要一个帮助。我正在使用键值对数组进行排序,我需要如果一个键值相同,那么它应该再次按字母顺序排列。请让我在下面解释我的代码。

{"data":[
    {"subcat_id":"9","subcat_name":"SUSHI","order":"9"},
    {"subcat_id":"20","subcat_name":"APPETIZERS","order":"6"},
    {"subcat_id":"6","subcat_name":"CHINESE","order":"4"},
    {"subcat_id":"26","subcat_name":"BRUNCH","order":"4"},
    {"subcat_id":"17","subcat_name":"ENTREES","order":"3"},
    {"subcat_id":"25","subcat_name":"HAPPY HOUR","order":"2"}
]} 

如果order值相同( lets say-order->4 ),则应该按照subcat_nameBRUNCH,CHINESE )的字母顺序subcat_name

您必须按订单ID创建组,然后对其进行排序。

$json = '{"data":[
    {"subcat_id":"9","subcat_name":"SUSHI","order":"9"},
    {"subcat_id":"20","subcat_name":"APPETIZERS","order":"6"},
    {"subcat_id":"6","subcat_name":"CHINESE","order":"4"},
    {"subcat_id":"26","subcat_name":"BRUNCH","order":"4"},
    {"subcat_id":"17","subcat_name":"ENTREES","order":"3"},
    {"subcat_id":"25","subcat_name":"HAPPY HOUR","order":"2"}
]}';

$data = json_decode($json);

$ordersGroups = array();
foreach ($data->data as $orderData) {
    if (!isset($ordersGroups[$orderData->order])) {
        $ordersGroups[$orderData->order] = array($orderData);
    } else {
        $ordersGroups[$orderData->order][] = $orderData;
    }
}

$ordersGroups = array_map(function ($orders) {
    usort($orders, function ($a, $b) {
        return strcmp($a->subcat_name, $b->subcat_name);
    });
    return $orders;
}, $ordersGroups);

$data->data = array_reduce($ordersGroups, function ($carry, $orderGroup) {
    return array_merge($carry, $orderGroup);
}, array());

$json = json_encode($data);

这可能起作用:

$array = //decode your JSON as an array here

$innerComparison = function ($v1, $v2) {
       return strcmp($v1["subcat_name"],$v2["subcat_name"]);
};   

$mainComparison = function ($v1, $v2) use ($innerComparison)  {
       if ($v1["order"] === $v2["order"]) {
             return $innerComparison($v1,$v2);
       } else {
          return $v1["order"] < $v2["order"]:-1:1; 
       }

};

usort($array["data"], $mainComparison);

您可以使用usort() 假设您的数据存储在$obj对象中:

usort
(
    $obj->data,
    function( $a, $b )
    {
        if( $a->order == $b->order ) return strcmp( $a->subcat_name, $b->subcat_name );
        return $a->order - $b->order;
    }
);

上面的函数根据您的要求对$obj->data进行排序。

评估演示

usort()使用自定义函数对数组进行排序,该函数接收数组的两个元素作为参数:如果第一个参数分别小于,等于或等于0,则返回的函数值必须是小于,等于或大于零的整数。等于或大于秒。

在您的情况下,如果->order键等于,则使用strcmp()返回基于->subcat_name排序值,否则我们返回两个->order值之间的差。


暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM