【问题标题】:PHP how to arrange array key values based on datePHP如何根据日期排列数组键值
【发布时间】:2021-03-25 19:18:46
【问题描述】:

我想根据数组值日期(从 - 到)排列数组键值,例如下面是我的数组,我想从这个数组中安排预订日期。

Array
(
    [0] => Array
        (
            [id] => 56
            [user_id] => 12
            [name] => A
            [email] => hhjhj@df.com
            [phone] => 4522111111
            [service_name] => a:1:{i:0;s:14:"Beard modeling";}
            [booking_date] => 2021-01-01
            [time] => 18:30:00
            [barbar_id] => 11
            [created_date] => 2021-01-01 12:11:35
        )

    [1] => Array
        (
            [id] => 57
            [user_id] => 12
            [name] => B
            [email] => hhjhj@df.com
            [phone] => 4522111111
            [service_name] => a:1:{i:0;s:14:"Beard modeling";}
            [booking_date] => 2021-01-09
            [time] => 18:30:00
            [barbar_id] => 11
            [created_date] => 2021-01-01 12:11:35
        )

    [2] => Array
        (
            [id] => 58
            [user_id] => 12
            [name] => C
            [email] => hhjhj@df.com
            [phone] => 4522111111
            [service_name] => a:1:{i:0;s:14:"Beard modeling";}
            [booking_date] => 2021-01-14
            [time] => 18:30:00
            [barbar_id] => 11
            [created_date] => 2021-01-01 12:11:35
        )

    [3] => Array
        (
            [id] => 61
            [user_id] => 12
            [name] => GGG
            [email] => d@fdfdf.com
            [phone] => 4522111111
            [service_name] => a:1:{i:0;s:14:"Beard modeling";}
            [booking_date] => 2021-01-17
            [time] => 18:30:00
            [barbar_id] => 11
            [created_date] => 2021-01-01 12:11:35
        )

    [4] => Array
        (
            [id] => 59
            [user_id] => 12
            [name] => k
            [email] => hhjhj@df.com
            [phone] => 4522111111
            [service_name] => a:1:{i:0;s:14:"Beard modeling";}
            [booking_date] => 2021-01-28
            [time] => 18:30:00
            [barbar_id] => 11
            [created_date] => 2021-01-01 12:11:35
        )

)

我想安排 booking_date 喜欢

booking_date :  2021-01-01 To 2021-01-09
booking_date :  2021-01-14 To 2021-01-17
booking_date :  2021-01-17 To 2021-01-28

我已经尝试过以下代码,但它不被认为是 booking_date : 2021-01-28

foreach ($getUsers as $kt=> $value) {    
    if($kt % 2 ==0){
        echo "booking_date".$getUsers[$kt]['booking_date'].'</br>';  



        $from = $getUsers[$kt]['booking_date'];
    }else{
       echo "booking_date ELSE".$getUsers[$kt]['booking_date'].'</br>';  
      // echo "EEE".$sql.'</br>';  

      $to =$from.' To ' .$getUsers[$kt]['booking_date'];

     }
}

请有人帮助我,我必须在脚本中更改什么?

【问题讨论】:

  • 您的预期输出背后的逻辑究竟是什么?您的数组中有 5 个元素,但您的输出显示其中 6 个。程序应该如何知道哪个元素要被使用两次?

标签: php arrays date foreach php-7


【解决方案1】:

对于您想要输出的原始问题:

booking_date :  2021-01-01 To 2021-01-09
booking_date :  2021-01-14 To 2021-01-17
booking_date :  2021-01-17 To 2021-01-28

我认为array_chunk 会很方便,因为您将项目配对在一起以创建“发件人”和“收件人”。

解决方案的另一部分只是跟踪倒数第二个booking_date,因此我们可以将其用作最后一个元素的from

我还添加了处理只有 1 个元素的数组,因为我不太确定您的用例。

 <?php

    $userBookings = [
         0 => [ 'booking_date' => '2021-01-01' ],
         1 => [ 'booking_date' => '2021-01-09' ],
         2 => [ 'booking_date' => '2021-01-14' ],
         3 => [ 'booking_date' => '2021-01-17' ],
         4 => [ 'booking_date' => '2021-01-28' ]
    ];

    $userBookingsPairs = array_chunk($userBookings, 2);

    $fromDate = $toDate = $previousToDate = '';

    foreach ($userBookingsPairs as $userBookingsChunk) {
            $isPair = count($userBookingsChunk) === 2;

            if ($isPair) {
                    $from = reset($userBookingsChunk);
                    $to = end($userBookingsChunk);
                    $fromDate = $from['booking_date'];
                    $previousToDate = $toDate = $to['booking_date'];
            } elseif (!empty($previousToDate)) {
                    // Last element following pairs
                    $to = reset($userBookingsChunk);
                    $fromDate = $previousToDate;
                    $toDate = $to['booking_date'];
            } else {
                    // Single element only
                    $to = reset($userBookingsChunk);
                    $toDate = $to['booking_date'];
                    echo "booking_date: {$toDate}<br>";
                    break;
            }

            echo "booking_date: {$fromDate} To {$toDate}<br>";
    }

至于你的第二个问题

2021-01-01 To 2021-01-09 , 2021-01-09 To 2021-01-14 , 2021-01-14 To 2021-01-17 And 2021-01-17 To 2021-01-28

所以基本来说,对于前 2 个元素,我们从元素 #1 和元素 #2 中获取 booking_date 并将它们组合起来。

对于接下来的 2 个元素,我们将元素 #2 的 booking_date 与元素 #3 组合,然后将元素 #3 与元素 #4 组合。以此类推,直到最后一个元素,我们将元素#n-1 与元素#n 组合在一起。

 <?php

      $userBookings = [
         0 => [ 'booking_date' => '2021-01-01' ],
         1 => [ 'booking_date' => '2021-01-09' ],
         2 => [ 'booking_date' => '2021-01-14' ],
         3 => [ 'booking_date' => '2021-01-17' ],
         4 => [ 'booking_date' => '2021-01-28' ]
      ];

      $output = '';

      $userBookingsPairs = array_chunk($userBookings, 2);

      $fromDate = $toDate = $previousFromDate = $previousToDate = '';

      foreach ($userBookingsPairs as $userBookingsChunk) {
           $isPair = count($userBookingsChunk) === 2;

           if ($isPair) {
                $from = reset($userBookingsChunk);
                $to = end($userBookingsChunk);
                $fromDate = $from['booking_date'];
                $toDate = $to['booking_date'];
                if (empty($previousFromDate)) {
                     // First iteration
                     $output = "$fromDate To $toDate";
                } else { // 'n'th iteration
                     // print date range using prior element
                     $output .= ", $previousToDate To $fromDate";

                     // print date range for this element
                     $output .= ", $fromDate To $toDate";
                }

                $previousFromDate = $fromDate;
                $previousToDate = $toDate;
           } elseif (!empty($previousToDate)) {
                // Last element following pairs
                $to = reset($userBookingsChunk);
                $output .= ", $previousToDate To {$to['booking_date']}";
           } else {
                // Single element only
                $to = reset($userBookingsChunk);
                $output = $to['booking_date'];
           }
      }

      echo $output;

【讨论】:

  • 仍然没有给出从 2021-01-17 到 2021-01-28 的最后日期
  • 正确,已更新以反映问题的那一部分,更接近?
  • 不,最后一次给预订日期:2021-01-17 到 2021-01-17 未显示 28
  • 嘿,是否可以列出像 2021-01-01 To 2021-01-09 , 2021-01-09 To 2021-01-14 , 2021-01-14 To 2021-01- 17 和 2021-01-17 至 2021-01-28
  • @RohanVarma 它是 Rohan,而不是立即使用 echo,您可以将结果存储在一个变量中(首先在 foreach 循环之前定义),然后在 foreach 之后打印它环形。我希望如果我解决了您最初的问题,您会接受它。你应该有一个足够接近的解决方案才能到达那里。不过,我很乐意回答这些后续问题。
【解决方案2】:

试试这样的:

for($i=0;$i<=count($getUsers);$i+2) {  
    if(isset($getUsers[$i]))
        echo "booking_date: ".$getUsers[$i]['booking_date'].'-'.$getUsers[$i+1]['booking_date'].'</br>';  

    }
}

【讨论】:

  • $i+2 创建一个无限循环 :)
  • 什么?你有一个限制,当你改变增量时,你不会创建任何无限循环。这个解决方案看起来不错。
  • @Ahmad 为除最后一个元素之外的每个元素提供了一个很好的解决方案(它在最后通过1 检查超出数组的边界)。回覆;无限循环,$i+2 没有增加,它把2 添加到$i 并且没有增加$i 的值(运行代码确认)。
  • 我怎样才能得到这个输出,2021-01-01 到 2021-01-09 , 2021-01-09 到 2021-01-14 , 2021-01-14 到 2021-01-17和 2021-01-17 到 2021-01-28
【解决方案3】:

使用a for bucle,增量为2。用“index”-“index+1”创建区间。

【讨论】:

    【解决方案4】:

    例如,您可以使用以下代码:

            foreach ($array as $kt => $value) {
    
            if ($kt % 2 !== 0) {
                continue;
            }
    
            $to = null;
            if(isset($array[$kt + 1])) {
                $to = ' To ' .$array[$kt + 1]['booking_date'];
            }
    
            echo 'booking_date: ' . $value['booking_date'] . $to . '<br>';
        }
    

    【讨论】:

    • 不起作用,也没有给出我在问题中解释的输出。
    • 未给出从 2021-01-17 到 2021-01-28 的最后日期结果
    • 因为数组的偶数键被假定为“from”,偶数键为“to”
    • 那么我怎样才能得到我想要的结果,我尝试了你但没有给出我想要的结果
    猜你喜欢
    • 1970-01-01
    • 2020-01-31
    • 1970-01-01
    • 2021-06-29
    • 2021-10-25
    • 1970-01-01
    • 2017-11-03
    • 2017-02-05
    • 2019-05-12
    相关资源
    最近更新 更多