Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP基于数组值(优先级)排序,但保留原始排序_Php_Sorting - Fatal编程技术网

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

PHP基于数组值(优先级)排序,但保留原始排序,php,sorting,Php,Sorting,我需要根据物品的销售量对数组进行排序。然后我需要对它进行排序,以便将优先级(高于零的任何内容)移到顶部我遇到的问题是,当我进行第二次排序(步骤3)时,它会从步骤2取消排序。 步骤1:我有一个数组: array( array( 'title' => 'A', 'priority' => 0, 'sold_count' => 44 ), array( 'title' => 'B',

我需要根据物品的销售量对数组进行排序。然后我需要对它进行排序,以便将优先级(高于零的任何内容)移到顶部我遇到的问题是,当我进行第二次排序(步骤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:我根据售出数量对其进行排序,并获得:

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步),而是得到了一个优先级排序正确的数组,但之后所有其他向导都有一个随机顺序。所有没有优先级(优先级===0)的辅助线都不应重新使用

我已经尝试过使用asort、aasort、customforeach和设置键以及这个multisort的一系列方法(下面的示例取自和)


注意:两种排序需要分别进行(因为第一种排序并不总是按销售数量排序,而是按日期或其他内容排序)。

您只需要按两列进行排序:

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;
});
usort($arr,function($a,$b){
如果($a['priority']=$b['priority']){
返回$a['salled_count']<$b['salled_count']?1:-1;
}
返回$a[“优先级”]<$b[“优先级”]?1:-1;
});

因此,如果优先级不同,它将按
优先级进行排序,否则它将按
销售量进行排序

您是否从链接的第一个问题开始尝试过?首先按
优先级
降序排序,然后按
售出数量
降序排序。还没有。让我看看。哇!太神了让我来试试你的解决方案。我给出了Seld_count作为一个例子,但是当我按优先级排序时,我不再有可用的Seld_count(参见我对zerkms答案的第一个评论)。我所能得到的是原始的排序/键。好的。我想出了一个好主意。这是一个黑客,但它的工作!看起来是个很好的解决方案。不过,我需要对这两个问题分别进行排序(参见我问题的最后一个注释)。原因是第一次排序(销售数量)并不总是按销售数量排序。比如说,大多数情况下都是这样。有时,它会使用自己的另一层排序(不用担心,我会缓存所有这些)。“将两者分开排序”——因此相应地更改比较器函数。“单独”排序没有任何意义——它仍然是一个由多个标准组成的单一排序。这是因为我的数据是从某种API中提取出来的。API对数据进行排序。我没有访问销售数量的权限,但我可以访问其排序方式。最初说API将返回
title(priority):A(0),B(0),D(1),C(0),E(0)
,然后我按优先级对其进行排序,得到:
D(1),E(0),B(0),A(0),C(0)
(优先级后的随机排序),而不是
D(1),A(0),B(0),C(0),E(0)
。从Jon上面描述的解决方案中进行的黑客攻击非常有效。现在我想起来了,我也可以使用您的解决方案,但用
优先级
替换
已售出数量
。我将在几分钟内通过测试进行更新。您的解决方案有效。(查看优先级之后的排序如何不保留其原始排序)
$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);
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;
});