按唯一 ID 合并 XML 个文件与 PHP
Combine XML files by unique ID with PHP
我有两个 XML 文件,它们是从第三方来源加载的。这两个文件具有不同的数据,除了在两个文件中也提供了唯一 ID。所以文件看起来像这样(粗略勾勒)
XML 1:
<cinemas>
<cinema>
<cinemaid>123</cinemaid>
<addressid>456</adressid>
<cinemaname>Best Cinema</cinemaname>
</cinema>
</cinemas>
XML 2:
<addresses>
<address>
<addressid>456</adressid>
<cinemaid>123</cinemaid>
<street>Best Street 5</street>
<postal>54332</postal>
<place>Best Town</place>
</address>
</addresses>
每个 XML- 文件都有多个通过两个 ID 相互链接的条目。我并没有真正将它们组合在一个文件中,我想在网站上显示带有地址的电影院名称。我只是想也许最好的解决方案是先合并然后遍历一个文件。
我使用 curl 从 URL 中读取了 XML 文件,然后 simplexml_load_string()
curl 输出可读 XML。
我用 foreach 循环遍历第一个 XML-File 并在其中 foreach 遍历另一个文件,并尝试与 if 语句进行比较。但它没有显示预期的结果。由于嵌套循环,它会多次显示每个电影院。
我怎样才能只显示带有两个 XML 文件地址的电影院列表。必须先把它们结合起来吗?我如何使用 PHP 执行此操作?
提前致谢!
您可以使用函数将 xml 转换为关联数组,然后重新排序并呈现数据以满足您的需要。
用 xml 个文件数组提供函数,例如:
$arr = xmlToArray(['data1.xml', 'data2.xml']);
function xmlToArray(array $xmlFiles = []): array
{
$arr = [];
foreach ($xmlFiles as $file) {
if (file_exists($file)) {
$xml = simplexml_load_file($file);
$json = json_encode($xml);
$arr[] = json_decode($json, TRUE);
} else {
echo 'Error: failed to open ' . $file . '!';
}
}
return $arr;
}
然后根据cinemaid
:
合并每个电影院的地址数据
$cinemaStore = [];
foreach ($arr[0]['cinema'] as $cinema) {
foreach ($arr[1]['address'] as $address) {
if ($address['cinemaid'] == $cinema['cinemaid']) {
$cinemaStore[$cinema['cinemaname']] = $address;
}
}
}
根据您提供的 xml 结构,这应该会给您这样的结果(我又添加了两个电影院):
Array
(
[Best Cinema] => Array
(
[addressid] => 456
[cinemaid] => 123
[street] => Best Street 5
[postal] => 54332
[place] => Best Town
)
[Worst Cinema] => Array
(
[addressid] => 444
[cinemaid] => 222
[street] => Worst Street 5
[postal] => 42424
[place] => Worst Town
)
[Coolest Cinema] => Array
(
[addressid] => 555
[cinemaid] => 333
[street] => Coolest Street 5
[postal] => 53535
[place] => Coolest Town
)
)
现在在您的视图中呈现数据应该是微不足道的。
我有两个 XML 文件,它们是从第三方来源加载的。这两个文件具有不同的数据,除了在两个文件中也提供了唯一 ID。所以文件看起来像这样(粗略勾勒)
XML 1:
<cinemas>
<cinema>
<cinemaid>123</cinemaid>
<addressid>456</adressid>
<cinemaname>Best Cinema</cinemaname>
</cinema>
</cinemas>
XML 2:
<addresses>
<address>
<addressid>456</adressid>
<cinemaid>123</cinemaid>
<street>Best Street 5</street>
<postal>54332</postal>
<place>Best Town</place>
</address>
</addresses>
每个 XML- 文件都有多个通过两个 ID 相互链接的条目。我并没有真正将它们组合在一个文件中,我想在网站上显示带有地址的电影院名称。我只是想也许最好的解决方案是先合并然后遍历一个文件。
我使用 curl 从 URL 中读取了 XML 文件,然后 simplexml_load_string()
curl 输出可读 XML。
我用 foreach 循环遍历第一个 XML-File 并在其中 foreach 遍历另一个文件,并尝试与 if 语句进行比较。但它没有显示预期的结果。由于嵌套循环,它会多次显示每个电影院。
我怎样才能只显示带有两个 XML 文件地址的电影院列表。必须先把它们结合起来吗?我如何使用 PHP 执行此操作?
提前致谢!
您可以使用函数将 xml 转换为关联数组,然后重新排序并呈现数据以满足您的需要。
用 xml 个文件数组提供函数,例如:
$arr = xmlToArray(['data1.xml', 'data2.xml']);
function xmlToArray(array $xmlFiles = []): array
{
$arr = [];
foreach ($xmlFiles as $file) {
if (file_exists($file)) {
$xml = simplexml_load_file($file);
$json = json_encode($xml);
$arr[] = json_decode($json, TRUE);
} else {
echo 'Error: failed to open ' . $file . '!';
}
}
return $arr;
}
然后根据cinemaid
:
$cinemaStore = [];
foreach ($arr[0]['cinema'] as $cinema) {
foreach ($arr[1]['address'] as $address) {
if ($address['cinemaid'] == $cinema['cinemaid']) {
$cinemaStore[$cinema['cinemaname']] = $address;
}
}
}
根据您提供的 xml 结构,这应该会给您这样的结果(我又添加了两个电影院):
Array
(
[Best Cinema] => Array
(
[addressid] => 456
[cinemaid] => 123
[street] => Best Street 5
[postal] => 54332
[place] => Best Town
)
[Worst Cinema] => Array
(
[addressid] => 444
[cinemaid] => 222
[street] => Worst Street 5
[postal] => 42424
[place] => Worst Town
)
[Coolest Cinema] => Array
(
[addressid] => 555
[cinemaid] => 333
[street] => Coolest Street 5
[postal] => 53535
[place] => Coolest Town
)
)
现在在您的视图中呈现数据应该是微不足道的。