【问题标题】:Custom sorting array of arrays using two conditions使用两个条件自定义排序数组
【发布时间】:2016-08-02 13:33:21
【问题描述】:

我有以下数组:

$arr = [
    [
        'user_id' => 1,
        'product_id' => 1
    ],
    [
        'user_id' => 1,
        'product_id' => 2
    ],
    [
        'user_id' => 1,
        'product_id' => 3
    ],
    [
        'user_id' => 2,
        'product_id' => 1
    ],
    [
        'user_id' => 2,
        'product_id' => 2
    ],
    [
        'user_id' => 3,
        'product_id' => 1
    ]
];

我想对其进行排序,使其看起来像这样:

$arr = [
    [
        'user_id' => 1,
        'product_id' => 1
    ],
    [
        'user_id' => 2,
        'product_id' => 1
    ],
    [
        'user_id' => 3,
        'product_id' => 1
    ],
    [
        'user_id' => 1,
        'product_id' => 2
    ],
    [
        'user_id' => 2,
        'product_id' => 2
    ],
    [
        'user_id' => 1,
        'product_id' => 3
    ]
];

所以基本上我需要按product_id 和user_id 订购,以便在继续下一个用户之前从每个用户中选择较低的数字product_id。

我尝试使用usort,但无法使用。

usort($campaigns, function($a, $b){
    if($a['product_id'] == $b['product_id']){
        return 0;
    }

    if($a['product_id'] < $b['product_id']){

        if($a['user_id'] == $b['user_id']){
            return 1;
        }

        if($a['user_id'] < $a['user_id']){
            return 0;
        }

        return -1;
    }else{

        if($a['user_id'] == $a['user_id']){
            return -1;
        }

        if($a['user_id'] < $a['user_id']){
            return 0;
        }

        return 1;
    }
});

我也尝试了array_multisort,但我所能做的就是使用我已经从数据库中检索到的相同订单进行订购。

【问题讨论】:

  • 您的usort 代码不正确;您应该通过第一个字段与&lt;/&gt; 进行比较,并且仅当第一个字段等于时才比较第二个字段。
  • 您是说您正在从数据库中检索,为什么您不直接对查询进行排序?

标签: php sorting multidimensional-array


【解决方案1】:

假设你的值是整数:

usort($campaigns, function($a, $b){
    if($a['product_id'] == $b['product_id']){
        return $a['user_id'] - $b['user_id'];
    } else {
        return $a['product_id'] - $b['product_id'];
    }
});

您还可以使用带有ORDER BY product_id, user_id 子句的数据库排序。

【讨论】:

    【解决方案2】:

    使用array_multisort 函数和“列数组”(很少排序维度)的解决方案:

    $userIds = $productIds = [];
    foreach ($arr as $k => $v) {
        $userIds[$k] = $v['user_id'];
        $productIds[$k] = $v['product_id'];
    }
    
    array_multisort($productIds, SORT_ASC, $userIds, SORT_ASC, $arr);
    
    print_r($arr);
    

    输出:

    Array
    (
        [0] => Array
            (
                [user_id] => 1
                [product_id] => 1
            )
    
        [1] => Array
            (
                [user_id] => 2
                [product_id] => 1
            )
    
        [2] => Array
            (
                [user_id] => 3
                [product_id] => 1
            )
    
        [3] => Array
            (
                [user_id] => 1
                [product_id] => 2
            )
    
        [4] => Array
            (
                [user_id] => 2
                [product_id] => 2
            )
    
        [5] => Array
            (
                [user_id] => 1
                [product_id] => 3
            )
    
    )
    

    【讨论】:

      【解决方案3】:
      $arrTags = [
          [
              'user_id' => 1,
              'product_id' => 1
          ],
          [
              'user_id' => 1,
              'product_id' => 2
          ],
          [
              'user_id' => 1,
              'product_id' => 3
          ],
          [
              'user_id' => 2,
              'product_id' => 1
          ],
          [
              'user_id' => 2,
              'product_id' => 2
          ],
          [
              'user_id' => 3,
              'product_id' => 1
          ]
      ];
      
      foreach($arrTags as $key => $row){ 
      $userArray[$key]  = $row['user_id'];
      $productArray[$key] = $row['product_id'];
      }
      
      array_multisort($productArray, SORT_ASC, $userArray, SORT_ASC, $arrTags);
      print_r($arrTags);
      

      输出

       Array
      (
          [0] => Array
              (
                  [user_id] => 1
                  [product_id] => 1
              )
      
          [1] => Array
              (
                  [user_id] => 2
                  [product_id] => 1
              )
      
          [2] => Array
              (
                  [user_id] => 3
                  [product_id] => 1
              )
      
          [3] => Array
              (
                  [user_id] => 1
                  [product_id] => 2
              )
      
          [4] => Array
              (
                  [user_id] => 2
                  [product_id] => 2
              )
      
          [5] => Array
              (
                  [user_id] => 1
                  [product_id] => 3
              )
      
      )
      

      您也可以在在线编辑器中查看。 Click Here

      【讨论】:

      • 您的输出与 OP 的预期输出不同。此外,您关于检查答案的评论完全是噪音和无用的。
      • 虽然这段代码 sn-p 可以解决问题,including an explanation 确实有助于提高您的帖子质量。请记住,您正在为将来的读者回答问题,而这些人可能不知道您的代码建议的原因。也请尽量不要用解释性的 cmets 挤满你的代码,这会降低代码和解释的可读性!
      • 请检查我编辑的代码。我只是忘了在 multisort 中更改 $userArray 和 $productArray。我已经在下面的链接编辑器中编辑了代码和输出。我不像你那样聪明和专家,但我正在尽力为用户提供有用的答案。 @Rizier123
      • 很抱歉给这个答案带来不便,因为我已经附加了输出而没有检查我的错。 array_multisort($productArray, SORT_ASC, $userArray, SORT_ASC, $arrTags); @Rizier123
      猜你喜欢
      • 2017-05-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-02-28
      • 1970-01-01
      • 2023-03-26
      • 2021-02-23
      • 2011-06-02
      相关资源
      最近更新 更多