【问题标题】:if in_array in php and xmlif in_array 在 php 和 xml
【发布时间】:2012-09-22 15:12:18
【问题描述】:

我有一个包含 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 值

如果值在 TYPE 数组中,我需要在循环中添加一个“if”语句以仅选择一些数据,例如:

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 呢?

【问题讨论】:

  • 有了"value I want",你能举个例子说明你会在那里得到什么吗?
  • 那不是数组而是字符串,所以in_array没有多大意义。最好先隔离问题,你的问题会更好,你会更快地解决它。
  • 我想要的值可以是 T1 , T2 ...,例如,我想在 TYPE 中具有 T1 的页面数据和 TYPE 中具有 T3 的其他页面数据中显示
  • @hakra ,你是什么意思?那么如何使用 if 语句来检查一个值是否存在于给定的 TYPE 列表中?
  • 请将var_dump($ITEMS-&gt;TYPE); 的输出添加到您的问题中。

标签: php xml arrays


【解决方案1】:

问题出在你准备的 $options 变量上,尝试像这样启动它;

PHP >= 5.3

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

PHP

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

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

这应该将类型分解为一个数组,删除引号并修剪多余的空格。

【讨论】:

  • 我收到了这个错误:“unexpected T_FUNCTION, expecting ')' in line”并且该行是针对“$options = array_map(function($type) {”
  • 添加了一个
  • 非常感谢 Jason Brumwell,它非常完美,我有 php 5.2.17,这就是它无法工作的原因 :)
【解决方案2】:

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

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

就是这样。这是可行的,因为您可能要查找的每个值都包含在双引号 " 中,这是一个共同原则。

顺便说一句,我认为您的代码会从一个简单的模板引擎中受益匪浅,例如Mustache。它也适用于迭代器(使用 foreach 迭代的值列表)。

【讨论】:

    猜你喜欢
    • 2013-03-30
    • 2012-08-03
    • 1970-01-01
    • 2015-01-15
    • 2019-06-29
    • 1970-01-01
    • 2011-10-05
    • 2021-05-02
    • 1970-01-01
    相关资源
    最近更新 更多