0

我需要根据商品的销售量对数组进行排序。然后我需要对其进行排序,以便将优先级(高于零的任何内容)移到顶部。我遇到的问题是,当我进行第二次排序(第 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、custom foreach 并设置键和这个 multisort 的方法(下面的例子,但取自这里这里,例子 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 排序,而是按日期或其他事物排序)。

4

1 回答 1

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

于 2013-05-30T09:16:59.343 回答