重新排序和分组现有数组
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);
我有一个 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);