PHP中的PHP访问数组

时间:2015-03-10 13:29:37

标签: php xml

我有一个加载XML表的PHP脚本,如下所示:

$feed = 'mydata.xml';
$xml = file_get_contents($feed);
$data = simplexml_load_string($xml);

echo print_r($data);

结果看起来像这样(虽然我已经砍掉了很多):

SimpleXMLElement Object
(
    [merchant] => SimpleXMLElement Object
        (
            [@attributes] => Array
                (
                    [id] => 1
                    [name] => companyname
                )

            [prod] => Array
                (
                    [0] => SimpleXMLElement Object
                         (
                            [@attributes] => Array
                                (
                                     [id] => 690579815
                                     [lang] => en
                                     [pre_order] => no
                                     [web_offer] => yes
                                     [in_stock] => yes
                                )

我的问题是,如何访问 prod 数组? 我希望能够像这样计算:

count($data['prod']);

并且还获得了特定的字段值,但我对PHP和XML很新,并且不能完全实现它。

谢谢!

3 个答案:

答案 0 :(得分:0)

要以关联数组的形式访问它,请执行以下操作:

$data = json_decode(json_encode($data), true);

然后您可以像这样访问它:

count($data['merchant']['prod'])

答案 1 :(得分:0)

SimpleXMLElement是一个对象,因此您还需要将它们作为对象访问:

print count($data->merchant->prod);

答案 2 :(得分:0)

  

我的问题是,如何访问prod阵列?

你不能。因为没有数组。但是你可以问,只是print_r只是在愚弄你一点。 SimpleXMLElement 是一个对象,它可以更改print_r&#39}时显示的内容,并伪造一些数组。

救援的一些基础知识:

$data表示您拥有的XML的文档元素。如果您不确定XML中的内容,而不是print_r查看$data->asXML()(如果您浏览浏览器视图源或将输出提示为纯文本,否则浏览器将隐藏所有标签。)

$data['prod']为您提供该文档元素上名为 prod 的属性。由于没有,它返回null

var_dump($data['prod']);   ---   NULL

count的{​​{1}}为0:

NULL

您既不想查看文档元素,也不想查找属性。您对商家元素中名为 prod 的子元素感兴趣。

首先获取第一个商家元素:

var_dump(count(NULL));     ---   int(0)

获取具有对象访问权限的元素,即使用对象运算符$merchant = $data->merchant;

获取名为 prod 的子元素数量的计数:

->

如图所示,我在var_dump(count($merchant->prod)); --- int(3) 所代表的商家元素中有三(3)个名为 prod 的孩子。

因此,您不需要任何数组, SimpleXMLElement 允许您访问XML文档中的所有XML元素。

如前所述,数组括号用于array-access。所以它看起来像一个数组,但它实际上是一个对象。它已被用于访问属性。但这只是真的,如果密钥不是数字。如果它是一个数字,它将访问第n个命名元素:

$merchant

将提供商家元素的第一个 prod 元素的XML:

  

var_dump($merchant->prod[0]->asXML());

由于它是第一个元素,您也可以获取它的 id 属性:

string(94) "<prod id="690579815" lang="en" pre_order="no" web_offer="yes" in_stock="yes">product #1</prod>"

确切地返回该属性:

  

var_dump($merchant->prod[0]['id']->asXML());

但它并不止于此。 XML元素和属性的每个 SimpleXMLElement 对象都可以加入字符串:

string(15) " id="690579815""

这通常是您正在寻找的实际信息。当您使用var_dump((string)$merchant->prod[0]); --- string(10) "product #1" var_dump((string)$merchant->prod[0]['id']); --- string(9) "690579815" 或类似内容时,此字符串转换将自动完成。

echo

与数组(和对象)类似,您也可以遍历每个 SimpleXMLElement 。例如echo $merchant->prod[0]; // prints: "product #1" 元素:

$merchant

给出:

foreach ($merchant as $children)
{
    echo $children->asXML(), "\n";
}

哪个是单个元素。更有趣的是命名的子元素:

<merchant id="1" name="companyname">
        <prod id="690579815" lang="en" pre_order="no" web_offer="yes" in_stock="yes">product #1</prod>
        <prod id="250544605" lang="en" pre_order="no" web_offer="yes" in_stock="yes">product #2</prod>
        <prod id="360355798" lang="en" pre_order="no" web_offer="yes" in_stock="yes">product #3</prod>
</merchant>

现在一个接一个地给所有名为 prod 的孩子:

foreach ($merchant->prod as $prod)
{
    echo $prod->asXML(), "\n";
}

您可以在PHP手册的Basic SimpleXML usage中找到这一点。请将其作为另一个来源咨询。

请遵守以下规则:

    SimpleXMLElement 一起使用时,
  • <prod id="690579815" lang="en" pre_order="no" web_offer="yes" in_stock="yes">product #1</prod> <prod id="250544605" lang="en" pre_order="no" web_offer="yes" in_stock="yes">product #2</prod> <prod id="360355798" lang="en" pre_order="no" web_offer="yes" in_stock="yes">product #3</prod> print_r作弊
  • 当您已经 SimpleXMLElement 时,您不需要阵列
  • 如果 SimpleXMLElement 在数据访问中过于简单,可以轻松使用它的姐姐DOM libraryswitch over to it

See the full example