PHP中从变量中删除重复字符串

3
我正在寻找一种从变量中删除重复行的方法:
$x = '<IMGURL>one.jpg</IMGURL>';
$x .= '<IMGURL>two.jpg</IMGURL>';
//remove the following line:
$x .= '<IMGURL>one.jpg</IMGURL>';
$x .= '<IMGURL>third.jpg</IMGURL>';

输出应该是:
$x = '<IMGURL>one.jpg</IMGURL><IMGURL>two.jpg</IMGURL><IMGURL>third.jpg</IMGURL>';

也许一些正则表达式可以解决这个问题?
编辑:
更多信息
源XML:
<?xml version=".0" encoding="utf-8"?>
<SHOP>
  <SHOPITEM>
    <name>BLUE product</name>
    <IMGURL>main_picture.jpg</IMGURL>
    <PRODUCT_VARIANT id="2">
      <name>blue L</name>
      <IMGURL>blue.jpg</IMGURL>
    </PRODUCT_VARIANT>
    <PRODUCT_VARIANT id="3">
      <name>BLUE XL</name>
      <IMGURL>blue.jpg</IMGURL>
    </PRODUCT_VARIANT>
    <PRODUCT_VARIANT id="4">
      <name>BLUE XXL</name>
      <IMGURL>blue.jpg</IMGURL>
    </PRODUCT_VARIANT>
  </SHOPITEM>
</SHOP>

我需要两个独特的jpg图片:

  • main_picture.jpg
  • blue.jpg

这个模块有趣的部分是处理源XML的部分:

foreach($xml->SHOPITEM as $product){
if(isset($product->IMGURL)){$xml_content .= '<IMAGE>'.htmlspecialchars($product->IMGURL).'</IMAGE>'."\n";}

foreach($product->variant as $option){
              if(isset($option->IMGURL)){$xml_content .= '<IMAGE>'.htmlspecialchars($option->IMGURL).'</IMAGE>'."\n";}
                      }
}

1
问题是,它们最初是如何创建的? - Funk Forty Niner
1
它是XML。将其加载到DOM中,查找重复项,删除这些节点。 - Marc B
这是我的第一个想法,使用XSLT实现。但源XML太复杂了,如果需要的话,我可以在这里发布一个示例。 - Adrian
@Adrian 是的,这是个好主意。 - fusion3k
你想要删除仅包含 <IMGURL> 标签的内容还是相对应的 <PRODUCT_VARIANT> 父级标签? - fusion3k
只需清空IMGURL标签,无需删除。父标签PRODUCT_VARIANT包含我需要的数据。 - Adrian
1个回答

3
这个示例代码可以将您的XML转化为所需的结果:
$dom = new DOMDocument();
$dom->formatOutput = True;
libxml_use_internal_errors( 1 );
$dom->loadXML( $x, LIBXML_NOBLANKS );

$xpath = new DOMXPath( $dom );

$nodes = $xpath->query( '//SHOP/SHOPITEM/PRODUCT_VARIANT/IMGURL' );
$found = array();

foreach( $nodes as $key => $node )
{
    if( in_array( $node->nodeValue, $found ) )
    { $node->nodeValue = ''; }
    else
    { $found[] = $node->nodeValue; }
}

$result = $dom->saveXML();

3v4l演示

基本上,只需使用数组来检索唯一值,并在通过xpath检索所有<IMGURL>节点后,使用foreach循环检查每个节点:如果它们存在于数组中,则将节点值设置为空字符串,否则将当前节点值添加到数组中。

以上脚本仅分析具有<PRODUCT_VARIANT>作为父节点的<IMGURL>;如果您想分析所有<IMGURL>节点,只需更改xpath行:

$nodes = $xpath->query( '*//IMGURL' );

太好了!非常感谢你。 - Adrian

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接