【问题标题】:Sort Multi dimensional array by Value and not include to sorting if priority value is 0按值对多维数组进行排序,如果优先级值为 0,则不包括排序
【发布时间】:2019-04-10 06:43:34
【问题描述】:

我必须按优先级在给定数组下方排序。如果优先级值为 0,则不包括在排序数组中。我尝试了很多方法,但没有得到预期的输出。

Array
(
[recently_viewed] => Array
    (
        [priority] => 1
        [no_of_products] => 1
    )

[recently_visited_cat] => Array
    (
        [priority] => 1
        [no_of_products] => 1
    )

[last_ordered_items] => Array
    (
        [priority] => 3
        [no_of_products] => 3
    )

[searched_based] => Array
    (
        [priority] => 0
        [no_of_products] => 4
    )

[cart_based] => Array
    (
        [priority] => 1
        [no_of_products] => 5
    )

[wishlist_based] => Array
    (
        [priority] => 1
        [no_of_products] => 6
    )

[sku_based] => Array
    (
        [priority] => 0
        [no_of_products] => 7
    )
)

请帮帮我。

【问题讨论】:

  • 我也试过了,但是不行。所以发布了新问题。
  • 那么请分享您的尝试,以便我们提供帮助。
  • 我猜你应该在排序前使用array_filter作为优先级0

标签: php arrays sorting multidimensional-array


【解决方案1】:

您可以使用array_filter() 函数排除优先级为0 的记录。之后,您可以使用帮助uasort() 函数对数组进行排序。例如:

$arr = array_filter($arr, function($element) {
    return $element['priority'] > 0;
});

uasort($arr, function ($a, $b) {
    if ($a['priority'] === $b['priority']) {
        return 0;
    }
    return ($a['priority'] < $b['priority']) ? -1 : 1;
});

【讨论】:

  • 您的uasort 回调代码可以简单地为return $a['priority'] &lt;=&gt; $b['priority']return $a['priority'] - $b['priority'](PHP7 之前)。请注意,它还取决于较高的优先级是否具有较高或较低的优先级值(否则只是切换操作数)。
  • @Jeto 当然可以,但我不知道 PHP 版本使用作者,因此我不使用 运算符
  • 对——另一种选择(-)适用于任何版本。
【解决方案2】:

您可以给我们array_filter (doc - 检查大于 0) 和 uasort (doc):

$arr = [];
$arr["recently_viewed"] = ["priority" => 1, "no_of_products" =>1];
$arr["searched_based"] = ["priority" => 0, "no_of_products" =>4];
$arr["last_ordered_items"] = ["priority" => 3, "no_of_products" =>3];

$arr = array_filter($arr, function ($e) {return $e["priority"];});
uasort($arr, function($a, $b) {
    return $a['priority'] - $b['priority'];
});

现场示例:3v4l

【讨论】:

  • 如果优先级为 1,那么它应该在数组的第一个。
  • @Magecode - 我做了 desc 命令 - 更新了 $a$b 的顺序 - 现在是 asc
【解决方案3】:

您可以使用array_filtercallback 函数来删除带有ZERO 的值

$arr = array_filter($arr, function ($e) {return $e["priority"];});

这将删除所有优先级为零的子数组。

现在您可以申请usort 对数组进行排序

usort($arr, function($a, $b)  {
    return $a['priority'] <=> $b['priority'];
});

查看工作代码Live

【讨论】:

  • 首先注意数组的键——OP 可能想要保留它们——所以使用uasort 而不是usort。第二 - 这里和其他答案有什么不同?
猜你喜欢
  • 2013-11-25
  • 1970-01-01
  • 1970-01-01
  • 2021-07-11
  • 2011-03-17
相关资源
最近更新 更多