PHP排序基于数组值(优先级)但保持原始排序

时间:2013-05-30 09:12:45

标签: php sorting

我需要根据商品的销售量对数组进行排序。然后我需要对它进行排序,以便优先级(任何高于零的值)移到顶部。 我遇到的问题是当我进行第二次排序(第3步)时,它会从第2步中取消排序。

第1步:我有一个数组:

array(
    array(
        'title' => 'A',
        'priority' => 0,
        'sold_count' => 44
    ),
    array(
        'title' => 'B',
        'priority' => 2,
        'sold_count' => 0
    ),
    array(
        'title' => 'C',
        'priority' => 1,
        'sold_count' => 3
    ),
    array(
        'title' => 'D',
        'priority' => 0,
        'sold_count' => 33
    ),
)

第2步:我根据sold_count对其进行排序并获取:

array(
    array(
        'title' => 'A',
        'priority' => 0,
        'sold_count' => 44
    ),
    array(
        'title' => 'D',
        'priority' => 0,
        'sold_count' => 33
    ),
    array(
        'title' => 'C',
        'priority' => 1,
        'sold_count' => 3
    ),
    array(
        'title' => 'B',
        'priority' => 2,
        'sold_count' => 0
    ),
)

第3步:按优先级排序(我应该得到的)。

array(
    array(
        'title' => 'B',
        'priority' => 2,
        'sold_count' => 0
    ),
    array(
        'title' => 'C',
        'priority' => 1,
        'sold_count' => 3
    ),
    array(
        'title' => 'A',
        'priority' => 0,
        'sold_count' => 44
    ),
    array(
        'title' => 'D',
        'priority' => 0,
        'sold_count' => 33
    ),
)

而不是得到我想要的东西(第3步),我得到一个优先顺序排列的数组,但是后面的所有其他指南都有一个随机顺序。不应该使用所有没有优先级的指南(优先级=== 0)。

我尝试过使用asort,aasort,自定义foreach以及设置密钥和此多重排序的一系列方法(以下示例,但取自herehere, the example 3)。

$sorterA =
$sorterB = array();

foreach($array as $k => $v) {
  $sorterA[$k] = $k;
  $sorterB[$k] = $v['priority'];
}

array_multisort($sorterA, SORT_NUMERIC, $sorterB, SORT_DESC, SORT_NUMERIC, $array);

注意:两种排序都需要单独完成(因为第一种排序并不总是按sold_count排序,而是按日期或其他方式排序)。

1 个答案:

答案 0 :(得分:2)

您只需按2列排序:

usort($arr, function($a, $b) {
    if ($a['priority'] == $b['priority']) {
        return $a['sold_count'] < $b['sold_count'] ? 1 : -1;
    }

    return $a['priority'] < $b['priority'] ? 1 : -1;
});

所以如果优先级不同,它会按priority排序,否则按sold_count

排序