【问题标题】:Sort based on multiple criteria on keys and values根据键和值的多个条件进行排序
【发布时间】:2015-09-10 14:15:33
【问题描述】:

我想使用 PHP 对下面的数组进行排序。主要问题是我需要根据多个条件对数组进行排序:

  • 先显示有价格的网站
  • 如果价格相同,按字母顺序排序
  • 如果多个网站没有价格,请按字母顺序排序

所以这个数组

array(
    [Beslist.nl] => Array
        (
            [price] => 141,63
        )

    [Wehkamp.nl] => Array
        (
            [price] => none
        )

    [Bol.com] => Array
        (
            [price] => none
        )

    [Zalando.nl] => Array
        (
            [price] => none
        )

    [Webwinkel.nl] => Array
        (
            [price] => none
        )

    [Overig.nl] => Array
        (
            [price] => none
        )
)

应该这样排序:

array(
    [Beslist.nl] => Array
        (
            [price] => 141,63
        )

    [Bol.com] => Array
        (
            [price] => none
        )

    [Overig.nl] => Array
        (
            [price] => none
        )

    [Webwinkel.nl] => Array
        (
            [price] => none
        )

    [Wehkamp.nl] => Array
        (
            [price] => none
        )

    [Zalando.nl] => Array
        (
            [price] => none
        )

)

我尝试了 asort 和 ksort,但是我需要根据多个条件进行排序,这使得它更加复杂。我希望我可以使用 SQL 对记录进行排序(当我从数据库中读取记录时)。但是,价格需要事后计算;这就是我需要使用 PHP 的原因。

谁能帮帮我?

【问题讨论】:

  • 您是否在 Stack Overflow 上,有人必须将您的标题复制并粘贴到 google 并在第一个结果中得到答案?
  • 查找 PHP 的 usort() function.
  • 你读过Reference: all basic ways to sort arrays and data in PHP吗? – 我会立即将其作为重复项关闭,但我会告诉您,您的数据结构看起来有一点点变化。
  • @Simba With usort() OP 将失去他的钥匙(对于所有支持你的评论但不知道它是做什么的人)
  • @Rizier123 同意他应该使用uasort()

标签: php sorting


【解决方案1】:

here 详细介绍了完全合适的方法,但考虑到数组的实际结构,这可能需要更多解释。具体来说,您可以通过以下方式同时按键和值进行排序:

uksort($array, function ($siteA, $siteB) use ($array) {
    $priceA = $array[$siteA]['price'];
    $priceB = $array[$siteB]['price'];

    if ($priceA == $priceB) {
        return strcmp($siteA, $siteB);
    }
    if (!$priceB) {
        return -1;
    }
    if (!$priceA) {
        return 1;
    }
    return $priceB - $priceA;
});

您可能需要在此处调整具体的比较和返回逻辑,但这说明了方法。

【讨论】:

  • 太棒了!谢啦!我正在这里查看您的答案:stackoverflow.com/questions/31183575/… 但无法正常工作:(。但是这个工作完美,太棒了,谢谢!
  • 剩下一个问题。我将return $priceB - $priceA; 更改为return $priceA - $priceB;,所以价格从高到低。但“无价”应该在底部。所以先价格从低到高,再“无价格”。有小费吗?尝试更改不同的值,但到目前为止没有运气。
  • 这就是if (!$priceA) 条件的用途。 如果价格相等,按站点排序,否则如果价格 B 没有,则 A 更高,否则如果价格 A 没有,B 更高,否则按价格排序。 根据需要调整这些条件您的实际“无”价格值是。
  • 我需要添加if($priceB < $priceA){ return 1; } if($priceB > $priceA){ return -1; } 才能完成这项工作:) 现在它可以完美运行了。对于任何正在寻找相同解决方案的人......
猜你喜欢
  • 2020-10-27
  • 2023-02-01
  • 2012-06-07
  • 1970-01-01
  • 2011-09-26
  • 2012-02-11
  • 1970-01-01
  • 2016-11-14
  • 1970-01-01
相关资源
最近更新 更多