PHP array_unique()-在减少数组之前先执行一些逻辑

PHP array_unique()-在减少数组之前先执行一些逻辑,php,arrays,laravel,Php,Arrays,Laravel,我有以下数组数据: array:3 [ 0 => array:5 [ "menu_id" => 7 "menu_name" => "Kasagbutan Meals" "menu_price" => "100.00" "qty" => "1" "special_instruc

我有以下数组数据:

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\u 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" => ""
  ]
]
array:2 [
  0 => array:5 [
    "menu_id" => 7
    "menu_name" => "Kasagbutan Meals"
    "menu_price" => "100.00"
    "qty" => "2" ----> THIS BECOMES 2 BECAUSE THE OTHER ITEM HAS A QTY OF 1.
    "special_instructions" => ""
  ]
  2 => array:5 [
    "menu_id" => 6
    "menu_name" => "Coke"
    "menu_price" => "50.00"
    "qty" => "1"
    "special_instructions" => ""
  ]
]
如何在减少阵列之前添加
数量
?我想添加已删除数组项的
数量
。所以基本上,理想的数组结果应该是这样的:

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" => ""
  ]
]
array:2 [
  0 => array:5 [
    "menu_id" => 7
    "menu_name" => "Kasagbutan Meals"
    "menu_price" => "100.00"
    "qty" => "2" ----> THIS BECOMES 2 BECAUSE THE OTHER ITEM HAS A QTY OF 1.
    "special_instructions" => ""
  ]
  2 => array:5 [
    "menu_id" => 6
    "menu_name" => "Coke"
    "menu_price" => "50.00"
    "qty" => "1"
    "special_instructions" => ""
  ]
]
array\u unique()
只是一个reduce操作。您需要的是稍微复杂一点的,所以使用
array\u reduce()

$exclude=array_flip(['qty']);//创建哈希时要排除的属性列表
$totals=array\u reduce($arr,function($totals,$item)use($exclude){
$id=数组差异键($item,$exclude);
ksort($id);//按键排序以始终获得相同的顺序
$hash=crc32(json_encode($id));
如果(数组\键\存在($hash,$totals)){
$totals[$hash]['qty']+=$item['qty'];
}否则{
$totals[$hash]=$item;
}
返回$totals;
}, []);
这将建立一个新数组,该数组由识别值(除
qty
之外的所有值)的散列键控,该散列在找到它已经知道的条目时,会增加
qty

为了提高速度,我使用了JSON编码字符串的CRC32哈希。不过,您几乎可以使用任何哈希/序列化组合

演示~

特别向以下帖子致意:

数组_unique()
只是一个reduce操作。您需要的是稍微复杂一点的,所以使用
array\u reduce()

$exclude=array_flip(['qty']);//创建哈希时要排除的属性列表
$totals=array\u reduce($arr,function($totals,$item)use($exclude){
$id=数组差异键($item,$exclude);
ksort($id);//按键排序以始终获得相同的顺序
$hash=crc32(json_encode($id));
如果(数组\键\存在($hash,$totals)){
$totals[$hash]['qty']+=$item['qty'];
}否则{
$totals[$hash]=$item;
}
返回$totals;
}, []);
这将建立一个新数组,该数组由识别值(除
qty
之外的所有值)的散列键控,该散列在找到它已经知道的条目时,会增加
qty

为了提高速度,我使用了JSON编码字符串的CRC32哈希。不过,您几乎可以使用任何哈希/序列化组合

演示~

特别向以下帖子致意:


您是否从关系型/nosql数据库获取数据?是什么使一个条目与另一个条目相等?仅仅是
菜单id
属性,还是它也考虑了其他属性?@Phil-如果它们在以下键中有相同的值:-菜单id-菜单名称-菜单价格-特殊说明,所以基本上除了
数量
之外,所有的都是
属性,所以你是说条目可以有相同的
菜单id
,但不同的
菜单名称
菜单\价格
等?如果一个名为“id”的字段不能识别记录,那么它有什么意义呢?@Phil-事实上,没有。理想情况下,如果它们具有相同的
菜单id
,那么它也将具有相同的
菜单名称
菜单价格
,等等。。我之所以包括
menu_id
,是因为我在前端返回这些数据,我的JS代码在这方面也做了一些逻辑工作。您是从关系型/nosql数据库获取这些数据的吗?是什么使一个条目等于另一个条目?仅仅是
菜单id
属性,还是它也考虑了其他属性?@Phil-如果它们在以下键中有相同的值:-菜单id-菜单名称-菜单价格-特殊说明,所以基本上除了
数量
之外,所有的都是
属性,所以你是说条目可以有相同的
菜单id
,但不同的
菜单名称
菜单\价格
等?如果一个名为“id”的字段不能识别记录,那么它有什么意义呢?@Phil-事实上,没有。理想情况下,如果它们具有相同的
菜单id
,那么它也将具有相同的
菜单名称
菜单价格
,等等。。我之所以包括
菜单id
,是因为我在前端返回了这些数据,我的JS代码也在这方面做了一些逻辑工作。谢谢,但我尝试在
特殊指令中添加了不同的值,但它将其与其他没有
特殊指令
值的指令组合在一起。这是在它运行您的代码之前:注意到另一个在
特殊指令中有一个值,这是在您的代码之后:理想的输出应该是这样的:谢谢,但是我尝试在
特殊指令
中添加一个不同的值,但它将它与其他没有
特殊指令
值的指令组合在一起。这是在它运行代码之前:注意到另一个在
特殊指令中有一个值,这是在代码之后:理想的输出应该是这样的: