按 d/m/Y 格式的日期列值的月份对多维数组的行进行分组,并在每行中重新格式化日期

问题描述 投票:0回答:2

下面是我的 json,我将 json 转换为 php 数组,然后尝试按月份对其进行分组,以便同一个月的数据保留在一个数组中,就像一个数组下的二月数据一样。我尝试过使用 foreach 来启动,但没有得到正确的结果。

下面是我的代码:

{

  "exam_dates": [

    {"id":"1","uni_name":"uni1","exam_name":"University of Szeged Feb","exam_date":"02\/02\/2022","exam_mode":"Online","appl_deadline":"To be announced"},
    {"id":"2","uni_name":"uni2","exam_name":"University of Szeged","exam_date":"21\/02\/2022","exam_mode":"Online","appl_deadline":"To be announced"},
    {"id":"3","uni_name":"uni3","exam_name":"University of Szeged","exam_date":"22\/02\/2022","exam_mode":"Online","appl_deadline":"To be announced"},
    {"id":"4","uni_name":"uni4","exam_name":"University of Szeged","exam_date":"32\/03\/2022","exam_mode":"Online","appl_deadline":"To be announced"}

  ]

}

$data = json_decode($body);

使用 exam_date 中的月份进行所需输出:

Array
(
    [0] => Array
        (
            [February] => stdClass Object
                (

                [0] => Array
                    [id] => 1
                    [uni_name] => University of Szeged Feb
                    [exam_name] => University of Szeged Feb
                    [exam_date] => 02/08/2022
                    [exam_mode] => Online
                    [appl_deadline] => To be announced
                )

                [1] => Array
                    [id] => 1
                    [uni_name] => University of Szeged Feb
                    [exam_name] => University of Szeged Feb
                    [exam_date] => 02/08/2022
                    [exam_mode] => Online
                    [appl_deadline] => To be announced
               )

                 [2] => Array
                        [id] => 1
                        [uni_name] => University of Szeged Feb
                        [exam_name] => University of Szeged Feb
                        [exam_date] => 02/08/2022
                        [exam_mode] => Online
                        [appl_deadline] => To be announced
                )

        )

    [1] => Array
        (
            [March] => stdClass Object
                [0] => Array
                    (
                        [id] => 2
                        [uni_name] => University of Szeged
                        [exam_name] => University of Szeged
                        [exam_date] => 03/06/2022
                        [exam_mode] => Online
                        [appl_deadline] => To be announced
                    )
            )
        )

)

我尝试使用这个但尚未关闭:

foreach ($data->exam_dates as $edates) {

    $month_name =  date("F", strtotime($edates->exam_date));

    $month_key[][$month_name] = $edates;

    echo "<pre>";
    print_r($month_key);

}
php arrays date multidimensional-array grouping
2个回答
0
投票

你们真的很亲密。基本上你需要做的就是改变这一行

$month_key[][$month_name] = $edates;

$month_key[$month_name][] = $edates;

但是最好也使用更可靠的日期操作方式,因此我使用内置的 DateTime 类而不是

strtodate()
date()

$body = '{

    "exam_dates": [
  
      {"id":"1","uni_name":"uni1","exam_name":"University of Szeged Feb","exam_date":"02\/02\/2022","exam_mode":"Online","appl_deadline":"To be announced"},
      {"id":"2","uni_name":"uni2","exam_name":"University of Szeged","exam_date":"21\/02\/2022","exam_mode":"Online","appl_deadline":"To be announced"},
      {"id":"3","uni_name":"uni3","exam_name":"University of Szeged","exam_date":"22\/02\/2022","exam_mode":"Online","appl_deadline":"To be announced"},
      {"id":"4","uni_name":"uni4","exam_name":"University of Szeged","exam_date":"22\/03\/2022","exam_mode":"Online","appl_deadline":"To be announced"}
  
    ]
  
  }';
  
$data = json_decode($body);
#print_r($data);

foreach ($data->exam_dates as $edates) {

    $d = (new DateTime())->CreateFromFormat('d/m/Y',$edates->exam_date);
    // get month name
    $month_name = $d->format('F');
    //format date to USA format
    $edates->exam_date = $d->format('m/d/Y');

    $month_key[$month_name][] = $edates;
}
print_r($month_key);

结果

Array
(
    [February] => Array
        (
            [0] => stdClass Object
                (
                    [id] => 1
                    [uni_name] => uni1
                    [exam_name] => University of Szeged Feb
                    [exam_date] => 02/02/2022
                    [exam_mode] => Online
                    [appl_deadline] => To be announced
                )

            [1] => stdClass Object
                (
                    [id] => 2
                    [uni_name] => uni2
                    [exam_name] => University of Szeged
                    [exam_date] => 02/21/2022
                    [exam_mode] => Online
                    [appl_deadline] => To be announced
                )

            [2] => stdClass Object
                (
                    [id] => 3
                    [uni_name] => uni3
                    [exam_name] => University of Szeged
                    [exam_date] => 02/22/2022
                    [exam_mode] => Online
                    [appl_deadline] => To be announced
                )

        )

    [March] => Array
        (
            [0] => stdClass Object
                (
                    [id] => 4
                    [uni_name] => uni4
                    [exam_name] => University of Szeged
                    [exam_date] => 03/22/2022
                    [exam_mode] => Online
                    [appl_deadline] => To be announced
                )

        )

)


0
投票

仅按月份分组而不考虑年份没有多大意义。这就是为什么我把这一年带进钥匙里。另外,日期格式选择得不好。

$groupedArray = [];
foreach($data->exam_dates as $dates){
  $key = dateTime::createFromFormat('!d/m/Y',$dates->exam_date)->format('F Y');
  $groupedArray[$key][] = $dates;
}

$groupedArray =

array (
  'February 2022' => 
  array (
    0 => 
    (object) array(
       'id' => "1",
       'uni_name' => "uni1",
       // :
© www.soinside.com 2019 - 2024. All rights reserved.