检查数组中的值是否相同,如果不同,则在 php 中存储为不同的顺序
Check if values are same in array, if not store as different orders in php
我发布这个问题是因为我在这里搜索时没有得到解决方案。
这是我的问题
从查看页面提交数据后,我有一个数组,它是用户选择预订特定日期(start_date 和 end_date)的产品列表。
就像他可能在同一日期选择了 3 种不同的产品,或者在不同的开始日期和 return 日期选择了所有 3 种产品。
现在我有一个数组,其中包含用户选择的所有产品以及 start_date 和 end_date 以及其他产品相关信息。
在将这些产品存储为订单之前,我需要检查
如果多个产品有相同start_date和end_date,则变成一个订单.
如果多个产品有不同start_date和end_date,则变成不同订单.
现在我如何检查这些产品是否具有相同的 start_date 和 end_date 或不同?
例如..这是一个数组
Array
(
[0] => Array
(
[product_id] => 15
[start_date] => 2019-05-15
[end_date] => 2019-05-16
[status] => in_stock
)
[1] => Array
(
[product_id] => 16
[start_date] => 2019-05-15
[end_date] => 2019-05-16
[status] => out_of_stock
)
[2] => Array
(
[product_id] => 17
[start_date] => 2019-05-17
[end_date] => 2019-05-18
[status] => in_stock
)
)
这是 3 种不同的产品,这里有 2 种产品在同一日期预订 product_id[15,16]-> 所以它变成了 一个订单.
而另一个product_id号17成为一秒订单。
编辑...
我现在已将状态添加到数组中,假设我在同一日期有 2 个订单 product_id[15,16],现在它必须根据两个条件进行排序,
如果多个订单有相同的 start_date 和 end_date,那么它将变成单个 order/array,这是我通过使用已接受的答案实现的。
现在假设排序后我得到一个数组,其中有 2 个不同的产品,一个是 in_stock,另一个是 out_of_stock,现在应该又变成两个不同的命令了。
请给出一些解决方案,因为我被困在这里。
您可以使用相同的键按数组分组,在您的例子中是开始日期和结束日期。也许是这样的:
$data = array(); // this is your array
$result = array();
foreach ($data as $element) {
/* this will create an array that have start and end date as the key.
So, order with same start and end date will be grouped as 1.*/
$result[$element['start_date']." to ".$element['end_date']][] = $element;
}
print_r($result); // do what you want
原始代码from this answer.
array_walk() - Apply a user supplied function to every member of an array
您可以使用 array_walk
并遍历 array
,将 arrays
分组到 start_date
。 $arr
是你的数组。
$res = [];
array_walk($arr, function($v, $k) use (&$arr,&$res){
$nextKey = array_key_exists($k+1, $arr) ? ($k+1) : '';
if(!empty($nextKey) &&
$v['start_date'] == $arr[$nextKey]['start_date'] &&
$v['end_date'] == $arr[$nextKey]['end_date']
){
$res[] = [$v, $arr[$nextKey]];
unset($arr[$nextKey]);
}else{
$res[] = [$v];
}
});
echo '<pre>';
print_r($res);
总订单使用数count($res)
我发布这个问题是因为我在这里搜索时没有得到解决方案。 这是我的问题
从查看页面提交数据后,我有一个数组,它是用户选择预订特定日期(start_date 和 end_date)的产品列表。 就像他可能在同一日期选择了 3 种不同的产品,或者在不同的开始日期和 return 日期选择了所有 3 种产品。
现在我有一个数组,其中包含用户选择的所有产品以及 start_date 和 end_date 以及其他产品相关信息。
在将这些产品存储为订单之前,我需要检查
如果多个产品有相同start_date和end_date,则变成一个订单.
如果多个产品有不同start_date和end_date,则变成不同订单.
现在我如何检查这些产品是否具有相同的 start_date 和 end_date 或不同?
例如..这是一个数组
Array
(
[0] => Array
(
[product_id] => 15
[start_date] => 2019-05-15
[end_date] => 2019-05-16
[status] => in_stock
)
[1] => Array
(
[product_id] => 16
[start_date] => 2019-05-15
[end_date] => 2019-05-16
[status] => out_of_stock
)
[2] => Array
(
[product_id] => 17
[start_date] => 2019-05-17
[end_date] => 2019-05-18
[status] => in_stock
)
)
这是 3 种不同的产品,这里有 2 种产品在同一日期预订 product_id[15,16]-> 所以它变成了 一个订单.
而另一个product_id号17成为一秒订单。
编辑...
我现在已将状态添加到数组中,假设我在同一日期有 2 个订单 product_id[15,16],现在它必须根据两个条件进行排序,
如果多个订单有相同的 start_date 和 end_date,那么它将变成单个 order/array,这是我通过使用已接受的答案实现的。
现在假设排序后我得到一个数组,其中有 2 个不同的产品,一个是 in_stock,另一个是 out_of_stock,现在应该又变成两个不同的命令了。
请给出一些解决方案,因为我被困在这里。
您可以使用相同的键按数组分组,在您的例子中是开始日期和结束日期。也许是这样的:
$data = array(); // this is your array
$result = array();
foreach ($data as $element) {
/* this will create an array that have start and end date as the key.
So, order with same start and end date will be grouped as 1.*/
$result[$element['start_date']." to ".$element['end_date']][] = $element;
}
print_r($result); // do what you want
原始代码from this answer.
array_walk() - Apply a user supplied function to every member of an array
您可以使用 array_walk
并遍历 array
,将 arrays
分组到 start_date
。 $arr
是你的数组。
$res = [];
array_walk($arr, function($v, $k) use (&$arr,&$res){
$nextKey = array_key_exists($k+1, $arr) ? ($k+1) : '';
if(!empty($nextKey) &&
$v['start_date'] == $arr[$nextKey]['start_date'] &&
$v['end_date'] == $arr[$nextKey]['end_date']
){
$res[] = [$v, $arr[$nextKey]];
unset($arr[$nextKey]);
}else{
$res[] = [$v];
}
});
echo '<pre>';
print_r($res);
总订单使用数count($res)