簡體   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