【问题标题】:Array element sorting using multiple keys inside the element - PHP [duplicate]使用元素内的多个键对数组元素进行排序 - PHP [重复]
【发布时间】:2023-03-25 14:50:01
【问题描述】:

我已经将数组转换为 JSON,如下所示:

[
    {
        "name": "Sally",
        "nick_name": "sal",
        "availability": "0",
        "is_fav": "0"
    },
    {
        "name": "David",
        "nick_name": "dav07",
        "availability": "0",
        "is_fav": "1"
    },
    {
        "name": "Zen",
        "nick_name": "zen",
        "availability": "1",
        "is_fav": "0"
    },
    {
        "name": "Jackson",
        "nick_name": "jack",
        "availability": "1",
        "is_fav": "1"
    },
    {
        "name": "Rohit",
        "nick_name": "rod",
        "availability": "0",
        "is_fav": "0"
    },

]

我想根据is_favavailabilitynick_name 的值按以下顺序对整个数组进行排序:

[ is_fav:1 availability:1 ]
[ is_fav:1 availability:0 ]
[ is_fav:0 availability:1 ]
[ is_fav:0 availability:0 ]

在每种情况下,元素都使用nick_name按字母顺序排列

所以上例中的最终数组看起来像

[
    {
        "name": "Jackson",
        "nick_name": "jack",
        "availability": "1",
        "is_fav": "1"
    },
    {
        "name": "David",
        "nick_name": "dav07",
        "availability": "0",
        "is_fav": "1"
    },
    {
        "name": "Zen",
        "nick_name": "zen",
        "availability": "1",
        "is_fav": "0"
    },
    {
        "name": "Rohit",
        "nick_name": "rod",
        "availability": "0",
        "is_fav": "0"
    },
    {
        "name": "Sally",
        "nick_name": "sal",
        "availability": "0",
        "is_fav": "0"
    },
]

【问题讨论】:

  • 好的你想实现排序,但是你试过什么,提供一些你试过的代码。
  • 如果你从数据库中获取这些数据,你可以简单地使用 MySQL 来实现它
  • 阅读此答案:stackoverflow.com/a/3233009
  • 如果您通过sql query 进行此操作,请更新您的查询,以便您可以自动获得正确的格式。
  • @SandeepBiradar 我在看array_multisort,但意识到我应该事先操作数组,但无法弄清楚如何破坏数组以输入方法。

标签: php arrays json sorting


【解决方案1】:

试试这个array_multisort

$arr = json_decode($data, true);
// Obtain a list of columns
foreach ($arr as $key => $row) {
    $isFav[$key] = $row['is_fav'];
    $avail[$key] = $row['availability'];
    $names[$key] = $row['nick_name'];
}

// Sort the data with isFav descending, avail descending
// Add $arr as the last parameter, to sort by the common key
array_multisort($isFav, SORT_DESC, $avail, SORT_DESC, $names, SORT_ASC, $arr);

你可以看到它在行动here (3v4l.org)

【讨论】:

  • 这个解决方案似乎适用于订单或is_favavailability。但是在实际数据上运行时,没有基于nick_name的排序。
  • 我仍然没有正确的顺序 nick_name :( 我需要 ASC,所以我已更改为 SORT_ASC。排序时如何处理 nullavailability 的值是 NULL1
  • 哦!我的错。我不知道这是区分大小写的排序。很抱歉。效果很好!
【解决方案2】:

你可以使用usort的PHP函数如as

usort($arr,function($a,$b){
    $c = $b['is_fav'] - $a['is_fav'];
    $c .= $b['availability'] - $a['availability'];
    $c .= strcmp($a['nick_name'],$b['nick_name']);
    return $c;
});
print_r($arr);

【讨论】:

    【解决方案3】:
    $arr = json_decode($data, true);
    usort($arr, function ($item1, $item2) {
        // your condition
        if ($item1['is_fav'] && !$item2['is_fav']) return 1;
        if (!$item1['is_fav'] && $item2['is_fav']) return -1;
        if ($item1['availability'] > $item2['availability']) return 1;
        if ($item1['availability'] < $item2['availability']) return -1;
        return 0;
    });
    $data = json_encode($arr);
    

    【讨论】:

      猜你喜欢
      • 2016-05-29
      • 1970-01-01
      • 2016-04-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-12-16
      • 1970-01-01
      • 2019-05-30
      相关资源
      最近更新 更多