PHP array_unique() - 在减少数组之前先进行一些逻辑处理。
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" => "" ] ]
问题出现的原因是使用了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/hG8C35Q0和pastebin.com/sCu76Que。期望的输出应该是:pastebin.com/Gk5ttWEr。