将XML文件与数组

时间:2015-08-31 04:19:14

标签: php arrays xml

我试图与XML文件进行比较。我已将new.xml拆开并将所有条形码放入数组中。然后我尝试遍历old.xml文件并测试数组中是否存在条形码。如果条形码确实存在,那么我想回显一个表行。当我开始工作的时候,我会将它翻转打印出来!存在。 XML文件的结构如下:

<Products>
    <Product>
       <Id>2209</Id>
       <Barcode>4890888123702</Barcode>
    </Product>
</products>

我的HTML和PHP看起来像这样:

<html>
<head>
    <title>Feeds = $$$$</title>
    <!-- Latest compiled and minified CSS -->
    <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.5/css/bootstrap.min.css">
    <!-- Optional theme -->
    <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.5/css/bootstrap-theme.min.css">
    <!-- Latest compiled and minified JavaScript -->
    <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.5/js/bootstrap.min.js"></script>

</head>

<body>
<div class="container-fluid">

<?php
//Get the old XML file
if (file_exists('old.xml')) {
    $oldxml = simplexml_load_file('old.xml');

    //Load all the old product IDs into an array
    $oldproducts = array();
    foreach($oldxml->Product as $oldproduct){
        $oldproducts[] = $oldproduct->Id;
    }
}else{
    echo "Old XML does not exist";
}

//Get the new xml file
if (file_exists('new.xml')){
    $newxml = simplexml_load_file('new.xml');

    //Load all the new product IDs into an array
    $newproducts = array();
    foreach ($newxml->Product as $newproduct){
        $newproducts[] = $newproduct->Id;
    }
}else{
    echo "New XML file does not exist";
}
?>
<div class="table-responsive">
    <table class="table table-striped">
        <?php
            foreach($oldxml->Product as $oldproduct) {
                $x = $oldproduct->Id;
                if(in_array($x, $newproducts)){
                    echo '<tr>';
                    echo '<td>' . $x . ' has been taken out of stock' . '</td>';
                    echo '</tr>';
                }

            }
        ?>
    </table>

</div>
</div>
</body>
</html>

循环没有返回任何东西。如果我使用硬编码条形码而不是$ x,它会找到它并正常工作。

2 个答案:

答案 0 :(得分:1)

当您使用SimpleXML时,您可能需要在将数据添加到数组并执行比较时输入您的ID。

例如,添加(int)可能会有所帮助:

foreach ($newxml->Product as $newproduct){
    $newproducts[] = (int) $newproduct->Id;
}

以及这里:

$x = (int) $oldproduct->Id;

为了进一步澄清这个答案,$newproduct->Id在执行比较时仍然是一个SimpleXMLElement,在这个阶段,当你将它转换为INT时,很可能XML结构中可能存在多个ID元素它将采用第一个ID元素的文本节点,并在转换为整数时使用它。

当您回显$newproduct->Id时,它会执行__tostring()转换,因为上下文已知。在比较中使用它时不知道上下文。

答案 1 :(得分:-1)

请更正您的xml文件格式错误并使用此更改您的条件:

if (in_array($x, (array)$newproducts[0])) {
      echo '<tr>';
      echo '<td>' . $x . ' has been taken out of stock' . '</td>';
      echo '</tr>';
}

希望这会对你有所帮助。