首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >循环中具有相同ID的组元素

循环中具有相同ID的组元素
EN

Stack Overflow用户
提问于 2019-12-12 07:02:13
回答 1查看 52关注 0票数 1
代码语言:javascript
复制
<?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循环来获取所有信息,所以基本上这是我得到的结果:

代码语言:javascript
复制
<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名称下分组):

代码语言:javascript
复制
<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>
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-12-12 07:21:04

您需要在输出数据之前对$request_data->availability数组进行排序,并维护最后一个optgroup标签值,这样您就不会两次输出相同的标签:

代码语言:javascript
复制
$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";

输出:

代码语言:javascript
复制
<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>

Demo on 3v4l.org

请注意,如果数组中的日期可能没有针对每个程序进行排序,您可以修改排序函数来处理这个问题(并首先给出最早的日期):

代码语言:javascript
复制
usort($request_data->availability, function ($a, $b) { 
    return strcmp($a->program->program, $b->program->program) ?: strcmp($a->dateStarts, $b->dateStarts);
});
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59295433

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
http://www.vxiaotou.com