<?php
$json = '{"name":"Test","id_test":8979,"availability":[{"dateStarts":"2019-12-14","dateEnds":"2019-12-21","dateFormat":"Dec 14 - 21, 2019","length":7,"spaces":5,"program":{"id":2,"title":"Long 2/2","program":"WESTERN ISLANDS"},"rate":{"id":2,"title":"Western Islands Program","prices":[{"custom":true,"defaultPrice":"4845","price":"4545","deck":"all cabins & decks","season":"","cabin":""}]}},{"dateStarts":"2019-12-21","dateEnds":"2019-12-28","dateFormat":"Dec 21 - 28, 2019","length":7,"spaces":"-1","program":{"id":1,"title":"Long 1/2","program":"EASTERN ISLANDS"},"rate":{"id":2,"title":"Eastern Islands Program","prices":[{"custom":false,"defaultPrice":"4845","price":"4845","deck":"all cabins & decks","season":"","cabin":""}]}},{"dateStarts":"2019-12-28","dateEnds":"2020-01-04","dateFormat":"Dec 28 - Jan 04 2020","length":7,"spaces":"-1","program":{"id":2,"title":"Long 2/2","program":"WESTERN ISLANDS"},"rate":{"id":2,"title":"Western Islands Program","prices":[{"custom":false,"defaultPrice":"4845","price":"4845","deck":"all cabins & decks","season":"","cabin":""}]}}]}';
$request_data = json_decode( $json ); ?>
<select class="select_availability" name="availability">
<?php
foreach($request_data->availability as $ava){
if($ava->rate->id == 2){
?>
<optgroup label="<?=$ava->program->program?>">
<option><?=$ava->dateFormat?></option>
</optgroup>
<?php
}
}
?>
</select>
测试链接:http://phpfiddle.org/main/code/gy8f-t3qq
我有一个转换成数组的json字符串,然后我使用foreach
循环来获取所有信息,所以基本上这是我得到的结果:
<select class="select_availability" name="availability">
<optgroup label="WESTERN ISLANDS">
<option>Dec 14 - 21, 2019</option>
</optgroup>
<optgroup label="EASTERN ISLANDS">
<option>Dec 21 - 28, 2019</option>
</optgroup>
<optgroup label="WESTERN ISLANDS">
<option>Dec 28 - Jan 04 2020</option>
</optgroup>
</select>
我正在寻找的输出(在program
名称下分组):
<select class="select_availability" name="availability">
<optgroup label="EASTERN ISLANDS">
<option>Dec 21 - 28, 2019</option>
</optgroup>
<optgroup label="WESTERN ISLANDS">
<option>Dec 14 - 21, 2019</option>
<option>Dec 28 - Jan 04 2020</option>
</optgroup>
</select>
发布于 2019-12-12 07:21:04
您需要在输出数据之前对$request_data->availability
数组进行排序,并维护最后一个optgroup
标签值,这样您就不会两次输出相同的标签:
$request_data = json_decode( $json );
usort($request_data->availability, function ($a, $b) {
return strcmp($a->program->program, $b->program->program);
});
echo '<select class="select_availability" name="availability">' . "\n";
$last_program = '';
foreach($request_data->availability as $ava){
if($ava->rate->id == 2){
if ($ava->program->program != $last_program) {
if ($last_program != '') echo "</optgroup>\n";
echo '<optgroup label="' . $ava->program->program . '">' . "\n";
$last_program = $ava->program->program;
}
echo "<option>$ava->dateFormat</option>\n";
}
}
if ($last_program != '') echo "</optgroup>\n";
echo "</select>\n";
输出:
<select class="select_availability" name="availability">
<optgroup label="EASTERN ISLANDS">
<option>Dec 21 - 28, 2019</option>
</optgroup>
<optgroup label="WESTERN ISLANDS">
<option>Dec 14 - 21, 2019</option>
<option>Dec 28 - Jan 04 2020</option>
</optgroup>
</select>
请注意,如果数组中的日期可能没有针对每个程序进行排序,您可以修改排序函数来处理这个问题(并首先给出最早的日期):
usort($request_data->availability, function ($a, $b) {
return strcmp($a->program->program, $b->program->program) ?: strcmp($a->dateStarts, $b->dateStarts);
});
https://stackoverflow.com/questions/59295433
复制相似问题