访问作为对象一部分的数组似乎失败

时间:2019-02-20 21:16:21

标签: php

我有以下代码段未达到我的期望:

var_dump($pronunciationResults);
$alignEntries = $pronunciationResults->alignEntry;
var_dump($alignEntries);

哪个会生成第一个var_dump(我已经删除了结构的末尾):

object(SimpleXMLElement)#1371 (1) {
  ["alignEntry"]=>
  array(123) {
    [0]=>
    object(SimpleXMLElement)#1375 (3) {
      ["@attributes"]=>
      array(1) {
        ["alignType"]=>
        string(2) "OK"
      }
      ["target"]=>
      string(3) "The"

其次是第二个var_dump的输出

object(SimpleXMLElement)#1373 (3) {
  ["@attributes"]=>
  array(1) {
    ["alignType"]=>
    string(2) "OK"
  }
  ["target"]=>
  string(3) "The"

我有一个非常简单的php程序,可以完全按预期工作,并且不知道为什么在这种情况下我得到了数组的第一个元素,而不是数组本身。

因此,@ trincot下面的评论很有趣。但是:

var_dump($pronunciationResults->children());
var_dump($pronunciationResults->children()->alignEntry);
var_dump($pronunciationResults->alignEntry->children());

为每个var_dump提供与上述完全相同的结构。

事实证明,即使var_dump并未将其显示为数组,foreach也会遍历原始alignEntries数组。

我不知道var_dump发生了什么

1 个答案:

答案 0 :(得分:2)

您的对象不是标准对象。您应该使用适当的API来使用它们。如果是SimpleXMLElement的实例,则可以通过方法children()获取children数组:

foreach ($pronunciationResults->children() as $child) {
    var_dump($child);
} 

当然,由于这些子元素也是SimpleXMLElement类的子元素,因此您还应该通过适当的方法来对待它们。因此,如果您想遍历它们的属性,请对它们调用attributes()方法,等等。

除了课程之外,不要专注于在var_dump中看到的内容。您会看到未记录的属性,这些属性不应直接使用。坚持那些对象的文档化接口。