如果in_array在php和xml中

时间:2012-09-22 15:12:19

标签: php xml arrays

我有一个包含500多个项目的长xml数据文件,它以这种形式出现:

<?xml version="1.0" encoding="ISO-8859-1"?>
<CATALOG>
<ITEM>
    <TITLE>ITEM name</TITLE>
    <TYPE>"T1", "T2", "T3" </TYPE>
    <DESCIPTION>DESCIPTIONiliate Page CPM</DESCIPTION>
    <PRICE>PRICE</PRICE>
    <ITEM>http://mysite.com/item-link</ITEM>
</ITEM>
</CATALOG>

我在php页面中使用以下代码从xml文件导入数据:

<?php
$ITEMSS = new SimpleXMLElement('ITEMS.xml', null, true);

echo <<<EOF
<table width="100%" align="center" border="1" bordercolor="#0099ff" cellpadding="1" cellspacing="0">

    <tr>
            <th bgcolor="#66ccff"><span class="style4">ITEM Name</span></th>
            <th bgcolor="#66ccff"><span class="style4">item TYPE </span></th>
            <th bgcolor="#66ccff"><span class="style4">item DESCIPTION </span></th>
            <th bgcolor="#66ccff"><span class="style4">item PRICE</span></th>
            <th bgcolor="#66ccff"><span class="style4">link to item</span></th>
    </tr>

EOF;
foreach($ITEMSS as $ITEMS) // loop through our DATAS
{
    echo <<<EOF
    <tr height="30" align=middle>
            <td><a href="{$ITEMS->ITEM}" target="_blank"><span class="STYLE7">{$ITEMS->TITLE}</span></a></td>
            <td><span class="STYLE8">{$ITEMS->TYPE}</span></td>
            <td><span class="STYLE8">{$ITEMS->DESCIPTION}</span></td>
            <td><span class="STYLE8">{$ITEMS->PRICE}</span></td>
            <td><a href="{$ITEMS->ITEM}" target="_blank"><B><span class="STYLE7">cHECK IT OUT</span></B></a></td>
    </tr>

EOF;
}
echo '</table>';
?>
TYPE中的

我有不同的值,如:

    <TYPE>"T1", "T2", "T3" </TYPE>
    <TYPE>"T1", "T4", "T6" </TYPE>
    <TYPE>"T1", "T8", "T1" </TYPE>

每个项目可能具有不同的TYPE值

我需要添加&#34; if&#34;循环中的语句只选择一些数据,如果一个值在TYPE数组中,那么就像:

foreach($ITEMSS as $ITEMS) // loop through our DATAS
{
$options = array($ITEMS->TYPE);

if (in_array("T1", $options))

   { echo <<<EOF
    <tr height="30" align=middle>
            <td><a href="{$ITEMS->ITEM}" target="_blank"><span class="STYLE7">{$ITEMS->TITLE}</span></a></td>
            <td><span class="STYLE8">{$ITEMS->TYPE}</span></td>
            <td><span class="STYLE8">{$ITEMS->DESCIPTION}</span></td>
            <td><span class="STYLE8">{$ITEMS->PRICE}</span></td>
            <td><a href="{$ITEMS->ITEM}" target="_blank"><B><span class="STYLE7">cHECK IT OUT</span></B></a></td>
    </tr>


EOF;
}

}

但即使我查找的值在数组中,也没有显示任何内容!

那么在这种情况下如何在数组语句中使用if?

2 个答案:

答案 0 :(得分:1)

问题来自你准备$ options变量,试着像这样启动它;

PHP&gt; = 5.3

$options = array_map(function($type) {
    return str_replace('"', '', trim($type));
}, explode(',', $ITEMS->TYPE));

PHP&lt; 5.3(将函数放出循环:D)

function parseTypes($type) {
    return str_replace('"', '', trim($type));
}

$options = array_map(parseTypes, explode(',', $ITEMS->TYPE));

这应该将类型分解为数组,删除引号并修剪额外的空格。

答案 1 :(得分:1)

不是在if循环中放置foreach子句,而是将另一个列表传递到foreach,只包含您要查找的元素。像魔术一样工作,实际上这叫做 xpath

$value = 'T1';
$list  = $ITEMSS->xpath('/CATALOG/ITEM[contains(TYPE, \'"' . $value . '"\')]');
foreach($list as $ITEMS)
{
    ...

就是这样。这是有效的,因为您可能想要查找的每个值都用双引号"括起来,这是一个共同的原则。

顺便说一句,我认为你的代码会从简单的模板引擎中获益很多,比如Mustache。它也适用于迭代器(使用foreach迭代的值列表)。