Php 解码JSON响应不同元素之间的交叉引用
我正在解码一个JSON响应并将其输出到一个表中。JSON响应分为三个元素(Php 解码JSON响应不同元素之间的交叉引用,php,json,Php,Json,我正在解码一个JSON响应并将其输出到一个表中。JSON响应分为三个元素(事件、组织者和场馆)和事件节点引用来自场馆和组织者元素的节点 下面是一个JSON响应的print\r显示示例: Array ( [Events] => Array ( [0] => Array ( [EventTitle] => Concert One
事件
、组织者
和场馆
)和事件
节点引用来自场馆
和组织者
元素的节点
下面是一个JSON响应的print\r
显示示例:
Array
(
[Events] => Array
(
[0] => Array
(
[EventTitle] => Concert One
[Details] => Array
(
[VenueID] => 100
[EventDate] => 2016-01-01
)
)
[1] => Array
(
[EventTitle] => Concert Two
[Details] => Array
(
[VenueID] => 150
[EventDate] => 2016-01-02
)
)
)
[Venues] => Array
(
[0] => Array
(
[HallID] => 100
[VenueName] => Venue A
)
[1] => Array
(
[HallID] => 150
[VenueName] => Venue B
)
)
)
实际的JSON示例如下所示:
{
"Events": [
{
"EventTitle": "Concert One",
"Details": {
"VenueID": 100,
"EventDate": "2016-01-01"
}
},
{
"EventTitle": "Concert Two",
"Details": {
"VenueID": 150,
"EventDate": "2016-01-02"
}
}
],
"Venues": [
{
"HallID": 100,
"VenueName": "Venue A"
},
{
"HallID": 150,
"VenueName": "Venue B"
}
]
}
下面是我用来创建表的foreach循环:
<?php
foreach($results['Events'] as $values)
{
echo '<tr><td>' . $values['EventTitle'] . '</td>';
echo '<td>' . $values['Details']['VenueID'] . '</td>';
echo '<td>' . $values['Details']['EventDate'] . '</td></tr>';
}
?>
我正在努力解决的是如何将场馆ID
(100150)替换为VenueName
(场馆A、场馆B),这样的结果是:
Event title | Event venue | Event date
Concert One | Venue A | 2016-01-01
Concert Two | Venue B | 2016-01-02
有可能做到这一点吗?我要做的是将您的
组织者
和场馆
解析到它们自己的数组中,ID作为键。因此,您将有这样一个数组(其中$arr
表示保存完整数组的变量)
您可以使用foreach
循环来构建它。然后,您将迭代您的事件
,使用键获取正确的关系数据(执行与$vention
相同的操作来构建$organizers
)
foreach($results['Events']作为$value){
回显'.$values['EventTitle'].';
回显“”。$VICENT[$values['Details']['VenueID'].';
回显“”。$organizer[$values['Details']['OrganizerID'].';
回显'.$values['Details']['EventDate'].';
}
试试这个:
foreach($results['Events'] as $values)
{
echo '<tr><td>' . $values['EventTitle'] . '</td>';
echo '<td>' . $results['Venues'][array_search($values['Details']['VenueID'], array_column($results['Venues'], 'HallID'))]['VenueName'] . '</td>';
echo '<td>' . $values['Details']['EventDate'] . '</td></tr>';
}
?>
foreach($results['Events']作为$value)
{
回显'.$values['EventTitle'].';
回显'.$results['viouses'][array_search($values['Details']['VenueID'],array_column($results['viouses'],'HallID'))]['VenueName'.';
回显'.$values['Details']['EventDate'].';
}
?>
一切都在一条线上 听起来很有趣,但我对第一部分感到困惑。组织者和场馆不是已经有阵列了吗?是的,但它们的结构方式对您没有直接的帮助。假设这是在一个单独的变量中,您将拥有
$ar['Values'][0]['VenueID']
,然后您必须迭代每个元素(非常耗时)。通过构建一个不同的阵列,$venture[100]='venture a'代码>您现在有了一个数据结构,它可以处理您的数据,并且是100%可扩展的。很抱歉,我花了这么长时间来尝试这个方法,我正在寻找一种方法来构建第一个数组(用于场地元素)。最后它可以工作了!:)我刚刚将场地改为场地,并将$arr改为$results。在第一个foreach中,它可以正常工作。非常感谢。我从第一个错误中得到了这些错误:警告:非法字符串偏移量“场所”警告:array\u column()期望参数1为array,string given警告:array\u search()期望参数2为array,null given您确定$result
包含您在问题中所说的内容吗?错误表明,$result['Organizers']
为空,foreach循环的其他部分工作正常,因此它应该包含所有内容。我简化了这个问题(去掉了关于组织者的部分,只留下场地,结构还是一样的)。我确实在Events元素中输入了一个ID为“VenueID”标识符的打字错误,但是Vincements元素有“HallID”标识符。同样的错误。它看起来不错,所以我必须再仔细研究一下,我不知道出了什么问题。我试着将它全部分离,只运行第一部分:
$venue = [];
foreach($arr['Venue'] as $vals) {
$venue[$vals['HallID']] = $vals['VenueName'];
}
foreach($results['Events'] as $values) {
echo '<tr><td>' . $values['EventTitle'] . '</td>';
echo '<td>' . $venue[$values['Details']['VenueID']] . '</td>';
echo '<td>' . $organizer[$values['Details']['OrganizerID']] . '</td>';
echo '<td>' . $values['Details']['EventDate'] . '</td></tr>';
}
foreach($results['Events'] as $values)
{
echo '<tr><td>' . $values['EventTitle'] . '</td>';
echo '<td>' . $results['Venues'][array_search($values['Details']['VenueID'], array_column($results['Venues'], 'HallID'))]['VenueName'] . '</td>';
echo '<td>' . $values['Details']['EventDate'] . '</td></tr>';
}
?>