使用两个条件对数组进行自定义排序


Custom sorting array of arrays using two conditions

我有以下数组:

$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_iduser_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($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子句一起使用。

使用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
        )
)
$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
        )
)

您还可以登录在线编辑器。单击此处