按唯一 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
        )

)

现在在您的视图中呈现数据应该是微不足道的。