如何根据名称获取数组的值?

时间:2014-06-23 15:46:24

标签: php xml

我有一些格式如下的xml数据:

<ADDITIONALINFORMATION>
     <ITEM>
        <MULTIPLEVALUES>0</MULTIPLEVALUES>
        <NAME>Some Name Here 1</NAME>
        <VALUEARRAY></VALUEARRAY>
        <VALUE>123</VALUE>
     </ITEM>

     <ITEM>
        <MULTIPLEVALUES>0</MULTIPLEVALUES>
        <NAME>Some Name Here 2</NAME>
        <VALUEARRAY></VALUEARRAY>
        <VALUE>abc</VALUE>
     </ITEM>

     <ITEM>
        <MULTIPLEVALUES>0</MULTIPLEVALUES>
        <NAME>Some Name Here 3</NAME>
        <VALUEARRAY></VALUEARRAY>
        <VALUE>456</VALUE>
     </ITEM>

     <ITEM>
        <MULTIPLEVALUES>0</MULTIPLEVALUES>
        <NAME>Some Name Here 4</NAME>
        <VALUEARRAY></VALUEARRAY>
        <VALUE>def</VALUE>
     </ITEM>
</ADDITIONALINFORMATION>

我使用以下方法循环数据:

foreach($listing->ADDITIONALINFORMATION->ITEM as $item) {

        if ($item->NAME == 'Some Name Here 3') {
             $val = ''; 
                 echo '';
        }
}

如何获得&#34; Some Name Here 3&#34;?

的价值

我不能使用$ item [3]这样的东西,因为有各种数量的物品。

2 个答案:

答案 0 :(得分:1)

这听起来像是xpath的工作:

//ITEM[NAME="Some Name Here 3"]

将获取所需的元素节点。 DOMDocumentSimpleXMLElement都支持xpath。我会留给您选择您要使用的那个。

答案 1 :(得分:1)

如果你问我(或kojiro),这是一个Xpath的工作,但你可以完全像你已经这样做,你只需要输出你的价值:

...

$val = $item->VALUE;
echo $val;

...

使用xpath可以在查询执行时对所有元素进行迭代,并为您提供更具体的结果:

$name  = 'Some Name Here 3';
$query = sprintf('//ITEM[NAME=%s]/VALUE', xpath_string($name));
list($value) = $listing->xpath($query) + [NULL];
echo $value;

完整的例子:

<?php
/**
 * @link http://stackoverflow.com/questions/24370072/how-to-get-the-value-of-an-array-based-on-its-name
 */

$buffer = <<<XML
<LISTING>
    <ADDITIONALINFORMATION>
        <ITEM>
            <MULTIPLEVALUES>0</MULTIPLEVALUES>
            <NAME>Some Name Here 1</NAME>
            <VALUEARRAY></VALUEARRAY>
            <VALUE>123</VALUE>
        </ITEM>

        <ITEM>
            <MULTIPLEVALUES>0</MULTIPLEVALUES>
            <NAME>Some Name Here 2</NAME>
            <VALUEARRAY></VALUEARRAY>
            <VALUE>abc</VALUE>
        </ITEM>

        <ITEM>
            <MULTIPLEVALUES>0</MULTIPLEVALUES>
            <NAME>Some Name Here 3</NAME>
            <VALUEARRAY></VALUEARRAY>
            <VALUE>456</VALUE>
        </ITEM>

        <ITEM>
            <MULTIPLEVALUES>0</MULTIPLEVALUES>
            <NAME>Some Name Here 4</NAME>
            <VALUEARRAY></VALUEARRAY>
            <VALUE>def</VALUE>
        </ITEM>
    </ADDITIONALINFORMATION>
</LISTING>
XML;

/**
 * xpath string handling xpath 1.0 "quoting"
 *
 * @link http://hakre.wordpress.com/2013/07/11/mitigating-xpath-injection-attacks-in-php/
 *
 * @param string $input
 *
 * @return string
 */
function xpath_string($input) {

    if (false === strpos($input, "'")) {
        return "'$input'";
    }

    if (false === strpos($input, '"')) {
        return "\"$input\"";
    }

    return "concat('" . strtr($input, array("'" => '\', "\'", \'')) . "')";
}

$listing = simplexml_load_string($buffer);

foreach ($listing->ADDITIONALINFORMATION->ITEM as $item) {
    if ($item->NAME == 'Some Name Here 3') {
        $val = $item->VALUE;
        echo $val;
    }
}

$name  = 'Some Name Here 3';
$query = sprintf('//ITEM[NAME=%s]/VALUE', xpath_string($name));
list($value) = $listing->xpath($query) + [NULL];
echo $value;