2013-05-30 108 views
0

我需要根据项目的销售量排序数组。然后我需要对它进行排序,以便将优先级(零以上的任何东西)移动到顶部。 时遇到的问题是,当我做第二次排序(步骤3)它取消排序的排序从步骤2基于数组值的PHP排序(优先级)但保持原始排序

步骤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和设置密钥和此multisort(下面的示例,但采取从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排序,而是按日期或其他东西)。

+0

你尝试[我的回答(HTTP:/ /stackoverflow.com/a/16788610/50079)从你链接到的第一个问题?首先按'priority'降序排序,然后按'sold_count'降序排序。 – Jon

+0

还没有。让我看看 – iDev247

+0

[看看](http://ideone.com/BOLilb)。 – Jon

回答

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

+0

看起来像一个很好的解决方案。不过,我需要分开排序(请参阅我的问题的最后一个注释)。原因是第一次排序(sold_count)并不总是按sold_count排序。这主要是例如。有时候,它会按照自己的其他排序顺序进行排序(不必担心我会缓存所有这些内容)。 – iDev247

+0

“分别对两者进行排序” - 因此相应地更改比较器功能。 “分离”排序是没有意义的 - 它仍然是由多个标准排序的一种排序 – zerkms

+0

对不起。这是因为我的数据是从一种API中提取的。 API对数据进行排序。我无权访问sold_count,但我可以访问其排序方式。最初说API会返回'title(优先级):A(0),B(0),D(1),C(0),E(0)'然后我按照优先级对它进行排序我会得到:'D (1),A(0),B(0),B(0),A(0),C(0) 0),E(0)'。上述Jon解决方案中的一个黑客工作很好。现在我想到了,我也可以使用你的解决方案,但用'priority'替换'sold_count'。我会在一对测试中更新。 – iDev247