PHP array_unique() - 在减少数组之前先进行一些逻辑处理。

6 浏览
0 Comments

PHP array_unique() - 在减少数组之前先进行一些逻辑处理。

我有这个数组数据:

array:3 [
  0 => array:5 [
    "menu_id" => 7
    "menu_name" => "Kasagbutan Meals"
    "menu_price" => "100.00"
    "qty" => "1"
    "special_instructions" => ""
  ]
  1 => array:5 [
    "menu_id" => 7
    "menu_name" => "Kasagbutan Meals"
    "menu_price" => "100.00"
    "qty" => "1"
    "special_instructions" => ""
  ]
  2 => array:5 [
    "menu_id" => 6
    "menu_name" => "Coke"
    "menu_price" => "50.00"
    "qty" => "1"
    "special_instructions" => ""
  ]
]

当我使用array_unique()运行它后,数据变成了这样:

array:2 [
  0 => array:5 [
    "menu_id" => 7
    "menu_name" => "Kasagbutan Meals"
    "menu_price" => "100.00"
    "qty" => "1"
    "special_instructions" => ""
  ]
  2 => array:5 [
    "menu_id" => 6
    "menu_name" => "Coke"
    "menu_price" => "50.00"
    "qty" => "1"
    "special_instructions" => ""
  ]
]

在减少数组之前,我如何添加qty?我想要添加被移除数组项的qty。所以基本上,理想的数组结果应该是这样的:

array:2 [
  0 => array:5 [
    "menu_id" => 7
    "menu_name" => "Kasagbutan Meals"
    "menu_price" => "100.00"
    "qty" => "2" ----> 这个变成2,因为另一项的qty为1。
    "special_instructions" => ""
  ]
  2 => array:5 [
    "menu_id" => 6
    "menu_name" => "Coke"
    "menu_price" => "50.00"
    "qty" => "1"
    "special_instructions" => ""
  ]
]

0
0 Comments

问题出现的原因是使用了array_unique()函数对数组进行去重操作,但是该函数只是简单的去重,不能满足需求。解决方法是使用array_reduce()函数进行更复杂的处理。

在给定的代码中,首先创建了一个排除属性qty的数组$exclude,然后使用array_reduce()函数对数组$arr进行操作。操作的逻辑是将除qty以外的所有属性值按照一定的顺序进行排序,然后将排序后的属性值进行JSON编码,并使用CRC32哈希算法生成一个哈希值。如果该哈希值已存在于$totals数组中,则将对应的qty值累加;否则,将整个数组项添加到$totals数组中。

为了提高速度,使用了CRC32哈希算法对JSON编码后的字符串进行哈希。当然,也可以使用其他哈希算法和序列化方式。

在给定的链接中提供了一个演示:https://3v4l.org/YDsfc

感谢以下相关帖子:

- PHP best way to MD5 multi-dimensional array?

- Return all array elements except for a given key

原文中还提到了一个问题,即在运行代码之前试图在special_instructions中添加不同的值,但是合并后的结果将它与没有special_instructions值的其他值合并了。给出了运行代码之前和运行之后的两个链接,分别是:pastebin.com/hG8C35Q0pastebin.com/sCu76Que。期望的输出应该是:pastebin.com/Gk5ttWEr

0