【问题标题】:Check if values are same in array, if not store as different orders in php检查数组中的值是否相同,如果不是在php中存储为不同的顺序
【发布时间】:2019-04-30 09:48:57
【问题描述】:

我发布这个问题是因为我在这里搜索时没有得到解决方案。 这是我的问题

从视图页面提交数据后,我有一个数组,它是用户选择预订某些日期(开始日期和结束日期)的产品列表。 比如他可能在同一日期选择了 3 种不同的产品,或者在不同日期的开始日期和返回日期选择了所有 3 种产品。

现在我有一个数组,其中包含用户选择的所有产品以及 start_date 和 end_date 以及其他产品相关信息。

在将这些产品存储为 ORDERS 之前,我需要检查

  1. 如果多个产品有相同 start_date 和 end_date,则成为一个订单

  2. 如果多个产品有不同 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 的产品变成了第二个订单。

编辑...

我现在已将状态添加到数组中,假设我在同一日期 product_id[15,16] 有 2 个订单,现在它必须根据两个条件进行排序,

  1. 如果多个订单具有相同的 start_date 和 end_date,则它变成单个订单/数组,这是我通过使用接受的答案实现的。

  2. 现在假设在排序后我得到一个数组,其中我有 2 个不同的产品,一个是 in_stock,另一个是 out_of_stock,现在它应该再次变为两种不同的顺序。

请给出一些解决方案,因为我被困在这里。

【问题讨论】:

    标签: php arrays arraylist foreach yii2-advanced-app


    【解决方案1】:

    您可以使用相同的键按数组分组,在您的情况下是开始日期和结束日期。也许是这样的:

    $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.

    【讨论】:

    • 谢谢,会用看看。
    • 你的答案对我有用,但我已经编辑了我的问题,还有一个要求,你能看看吗?
    • 只需将库存状态添加到键中。 $result[$element['start_date']." 到 ".$element['end_date']."_".$element['status']][] = $element;数组键如下所示:“2019-05-15 到 2019-05-16_in_stock”“2019-05-15 到 2019-05-16_out_of_stock”
    【解决方案2】:

    array_walk() - 将用户提供的函数应用于数组的每个成员

    您可以使用array_walk 并遍历array 以将arraysstart_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,我想要两个日期。
    • 您的意思是 start_date 和 end_date 都与另一个数组相比?
    • @RakeshJakhar 如果日期继续,则显示正确答案,但对于具有不同行的订单日期,则无法正确显示,例如:第 1 行开始日期:07-05-19 第 2 行开始日期:08 -05-19 row3 startdate: 07-05-19 在这种情况下,第 1 行和第 3 行具有相同的值,但它显示了 3 个不同的日期,但是如果我将第 3 行移动到第 2 行,它工作正常,因为它紧随其后.
    猜你喜欢
    • 1970-01-01
    • 2019-07-20
    • 1970-01-01
    • 2021-08-16
    • 2018-10-27
    • 1970-01-01
    • 2021-12-11
    • 1970-01-01
    • 2017-04-25
    相关资源
    最近更新 更多