重新排序和分组现有数组

Reordering and grouping existing array

我有一个 JSON 数组,格式如下,在 PHP 中生成,使用 foreach 循环从 WP ACF 组生成数组(见下文)。在获取此 ACF 组的特定字段时,我似乎无法使用 GROUP BY,因此名称的双重输入(不同时间)如图所示。

[
    {"name":"Location1","gigs": 
        {"start":"16:30","end":"21:15","title":"TestTitle1","class":"fri"}
    },
    {"name":"Location 2","gigs":
        {"start":"15:00","end":"19:00","title":"TestTitle2","class":"fri"}
    },
    {"name":"Location 1","gigs":
        {"start":"21:00","end":"22:00","title":"TestTitle3","class":"fri"}
    }
]

这个 JSON 数组的格式应该如下所示,不同之处在于具有相同 name/location 的条目应该组合如下所示。

[
    {
        "name":"Location1",
        "gigs": [
            {"start":"16:30","end":"21:15","title":"TestTitle1","class":"fri"},
            {"start":"21:00","end":"22:00","title":"TestTitle3","class":"fri"}
        ]
    },
    {
        "name":"Location 2",
        "gigs": [
            {"start":"15:00","end":"19:00","title":"TestTitle2","class":"fri"}
        ]
    }
]

我尝试了 PHP 中可用的几个数组 merge/combine/sort/etc 函数,但无法按预期输出。

这是生成 array/JSON 输出的代码:

function get_shows( WP_REST_Request $request ) {
    $parameters = $request->get_params();

    switch($parameters[1]) {
        case 'fri':
            $show_day = 'fri';
            $show_select_day = '20170901';
            break;
        case 'sat':
            $show_day = 'sat';
            $show_select_day = '20170902';
            break;
        case 'sun':
            $show_day = 'sun';
            $show_select_day = '20170903';
            break;
    }

    $showDates   = array();
    $args = array(
        'posts_per_page'    => -1,
        'post_type'         => 'performances',
        'meta_key'          => 'per_date',
        'meta_value'        => $show_select_day
    );

    $shows = get_posts( $args );

    if ( ! empty( $shows ) ) {
        $i = 0;
        foreach( $shows as $show ) {
            $acf = get_fields($show->ID);
            $show_loc = get_the_title(get_field('per_location',$show->ID));
            $show_title = get_the_title(get_field('per_busker',$show->ID));

            if ( ! empty( $acf ) ) {
                $showDates[$i]['name'] = $show_loc;
                $showDates[$i]['gigs']['start']     = date("H:i", strtotime($acf['per_time_start']));
                $showDates[$i]['gigs']['end']   = date("H:i", strtotime($acf['per_time_end']));
                $showDates[$i]['gigs']['title']     = $show_title;
                $showDates[$i]['gigs']['class']     = $show_day;

            }
            $i++;
        }
    }
   return   $showDates;
}

我们非常欢迎任何以正确格式输出的建议。非常感谢!

尝试以下解决方案。我已将您的密钥 Location1 更改为 Location 1 因为 Location1 != Location 1

$json_data = '[
    {"name":"Location 1","gigs": 
        {"start":"16:30","end":"21:15","title":"TestTitle1","class":"fri"}
    },
    {"name":"Location 2","gigs":
        {"start":"15:00","end":"19:00","title":"TestTitle2","class":"fri"}
    },
    {"name":"Location 1","gigs":
        {"start":"21:00","end":"22:00","title":"TestTitle3","class":"fri"}
    }
]';
$arr = json_decode($json_data,true);
$new_array = array();
foreach ($arr as $key => $value) {
  if(isset($new_array[$value['name']]))
      $new_array[$value['name']]['gigs'][] = $value['gigs'];
    else{
      $new_array[$value['name']]['name'] = $value['name'];
      $new_array[$value['name']]['gigs'][] = $value['gigs'];
    }
}
$new_array = array_values($new_array); //to remove keys
echo json_encode($new_array);

DEMO