【问题标题】:PHP Sort Array by multiple values : positive/negative then second valuePHP按多个值排序数组:正/负然后是第二个值
【发布时间】:2021-05-11 13:06:25
【问题描述】:

我陷入了一个起初对我来说似乎很简单的 PHP 概念:

我有这个数组:

$test = array(
    array(
        'quantity' => 0,
        'nbr_sales' => 10
    ),
    array(
        'quantity' => 10,
        'nbr_sales' => 100
    ),
    array(
        'quantity' => 10,
        'nbr_sales' => 1250
    ),
    array(
        'quantity' => 20,
        'nbr_sales' => 5000
    ),
    array(
        'quantity' => -1,
        'nbr_sales' => 990
    ),
    array(
        'quantity' => 0,
        'nbr_sales' => 1000
    )
);

我想通过检查quantity 是正数还是负数,然后通过nbr_sales (DESC) 对这个多维数组进行排序,所以结果如下:

$result = array(
    array(
        'quantity' => 20,
        'nbr_sales' => 5000
    ),
    array(
        'quantity' => 10,
        'nbr_sales' => 1250
    ),
    array(
        'quantity' => 10,
        'nbr_sales' => 100
    ),
    array(
        'quantity' => 0,
        'nbr_sales' => 1000
    ),
    array(
        'quantity' => 0,
        'nbr_sales' => 10
    ),
    array(
        'quantity' => -1,
        'nbr_sales' => 990
    )
);

我尝试了几种方法,但都没有真正的结论:

$result = array();
$positives = array(); $negatives = array();
foreach($test as $t) {
    $t['quantity'] > 0 ? array_push($positives, $t) : array_push($negatives, $t);
}
usort($positives, function($a, $b){
    return $a['nbr_sales'] == $b['nbr_sales'] ? 0 : ($a['nbr_sales'] < $b['nbr_sales'] ? 1 : -1);
});
usort($negatives, function($a, $b){
    return $a['nbr_sales'] == $b['nbr_sales'] ? 0 : ($a['nbr_sales'] < $b['nbr_sales'] ? 1 : -1);
});
array_push($result, $positives);
array_push($result, $negatives);

var_dump($result)

array(2) {
  [0] => array(3) {
    [0] => array(2) {
      ["quantity"] => int(20)
      ["nbr_sales"]=> int(5000)
    }
    [1]=> array(2) {
      ["quantity"] => int(10)
      ["nbr_sales"]=> int(1250)
    }
    [2] => array(2) {
      ["quantity"] => int(10)
      ["nbr_sales"]=> int(100)
    }
  }
  [1]=> array(3) {
    [0] => array(2) {
      ["quantity"] => int(0)
      ["nbr_sales"]=> int(1000)
    }
    [1]=> array(2) {
      ["quantity"]=> int(-1)
      ["nbr_sales"] => int(990)
    }
    /* should be above */
    [2]=> array(2) {
      ["quantity"] => int(0)
      ["nbr_sales"] => int(10)
    }
  }
}

感谢您的帮助:)

【问题讨论】:

  • 请分享您的努力并解释它在哪里以及如何准确地未能满足您的需求。在不显示您尝试过的情况下发布问题是一种快速通道,可以通过 this one 等规范目标结束您的问题。

标签: php arrays sorting


【解决方案1】:

从视觉上看,这不是我要搜索的结果。例如,如果我改变

$data = [
    [
        'quantity' => 0,
        'nbr_sales' => 10
    ], [
        'quantity' => 10000, // change here
        'nbr_sales' => 100
    ], [
        'quantity' => 10,
        'nbr_sales' => 1250
    ], [
        'quantity' => 20,
        'nbr_sales' => 5000
    ], [
        'quantity' => -1,
        'nbr_sales' => 990
    ], [
        'quantity' => 0,
        'nbr_sales' => 1000
    ]
];

usort($data, function($a, $b) {
    $q = $b['quantity'] - $a['quantity'];
    if ($q != 0) return $q;
    return $b['nbr_sales'] - $a['nbr_sales'];
});

我明白了:

array(6) {
  [0]=> array(2) {
    ["quantity"]=> int(10000)
    ["nbr_sales"]=> int(100)
  }
  [1]=> array(2) {
    ["quantity"]=> int(20)
    ["nbr_sales"]=> int(5000)
  }
  [2]=> array(2) {
    ["quantity"]=> int(10)
    ["nbr_sales"]=> int(1250)
  }
  [3]=> array(2) {
    ["quantity"]=> int(0)
    ["nbr_sales"]=> int(1000)
  }
  [4]=> array(2) {
    ["quantity"]=> int(0)
    ["nbr_sales"]=> int(10)
  }
  [5]=> array(2) {
    ["quantity"]=> int(-1)
    ["nbr_sales"]=> int(990)
  }
}

但我正在寻找这个:

array(6) {
  [0]=> array(2) {
    ["quantity"]=> int(20)
    ["nbr_sales"]=> int(5000)
  }
  [1]=> array(2) {
    ["quantity"]=> int(10)
    ["nbr_sales"]=> int(1250)
  }
  [2]=> array(2) {
    ["quantity"]=> int(10000)
    ["nbr_sales"]=> int(100)
  }
  [3]=> array(2) {
    ["quantity"]=> int(0)
    ["nbr_sales"]=> int(1000)
  }
  [4]=> array(2) {
    ["quantity"]=> int(0)
    ["nbr_sales"]=> int(10)
  }
  [5]=> array(2) {
    ["quantity"]=> int(-1)
    ["nbr_sales"]=> int(990)
  }
}

【讨论】:

  • 这个“答案”是否意味着对我的答案的评论?如果是这样,您将需要进一步解释。您现在写的内容与您在问题中写的内容相矛盾。您将需要解释排序的逻辑。为什么 10000 应该被认为 小于 然后 10?
  • (我会删除这个答案:-))正如我所说,我想检查数量是正数还是负数:如果是正数,我想先按 nbr_result DESC 排序,然后按 qty ASC 然后如果否定的,我想先按 qty ASC 排序,然后按 nbr_result DESC
  • 按该列排序确实区分正面和负面。您将不得不进一步解释......因为如果您的意思是除了“数量”列的符号之外,只有“nbr_sales”列的顺序应该计算在内,那么您提出的结果再次没有任何意义:1000不小于100。所以你需要进一步解释......
【解决方案2】:

您希望分两步进行排序。所以使用回调来做到这一点:

<?php
$data = [
  [
    'quantity' => 0,
    'nbr_sales' => 10
  ], [
    'quantity' => 10,
    'nbr_sales' => 100
  ], [
    'quantity' => 10,
    'nbr_sales' => 1250
  ], [
    'quantity' => 20,
    'nbr_sales' => 5000
  ], [
    'quantity' => -1,
    'nbr_sales' => 990
  ], [
    'quantity' => 0,
    'nbr_sales' => 1000
  ]
];

usort($data, function($a, $b) {
  $q = $b['quantity'] <=> $a['quantity'];
  if ($q != 0) return $q;
  return $b['nbr_sales'] <=> $a['nbr_sales'];
});

print_r($data);

如果您更喜欢等效的三进制表示法:

usort($data, function($a, $b) {
  return 
    0 == $b['quantity'] - $a['quantity']
      ? $b['nbr_sales'] <=> $a['nbr_sales'] 
      : $b['quantity'] <=> $a['quantity'];
});

输出显然是:

Array
(
    [0] => Array
        (
            [quantity] => 20
            [nbr_sales] => 5000
        )
    [1] => Array
        (
            [quantity] => 10
            [nbr_sales] => 1250
        )
    [2] => Array
        (
            [quantity] => 10
            [nbr_sales] => 100
        )
    [3] => Array
        (
            [quantity] => 0
            [nbr_sales] => 1000
        )
    [4] => Array
        (
            [quantity] => 0
            [nbr_sales] => 10
        )
    [5] => Array
        (
            [quantity] => -1
            [nbr_sales] => 990
        )
)

【讨论】:

  • 我使用的是 PHP 5.6 :-/
  • 然后只需将宇宙飞船运算符(“”)替换为简单的减号(“-”)。在此工作相同...
猜你喜欢
  • 1970-01-01
  • 2011-01-17
  • 1970-01-01
  • 2011-02-13
  • 2011-10-25
  • 1970-01-01
  • 1970-01-01
  • 2017-02-27
相关资源
最近更新 更多