0

我在使用 PHP 数组时遇到了一些问题,据我所知,它应该可以工作。我正在使用 simpleXML 并循环一个 simpleXML 输出。然后,我尝试从相关的 XML 节点中删除“id”属性,将其指定为数组中新项目的键,并将值指定为国家/地区名称。这是我的 simpleXML 输出示例($cxml在下面的代码中):

SimpleXMLElement Object ( 
  [country] => Array ( 
    [0] => SimpleXMLElement Object ( 
      [@attributes] => Array ( [id] => AD ) 
      [name] => ANDORRA 
      [ssc] => EUR 
    ) 
    [1] => SimpleXMLElement Object ( 
      [@attributes] => Array ( [id] => AE ) 
      [name] => UNITED ARAB EMIRATES 
      [ssc] => EUR 
    ) 
    [2] => SimpleXMLElement Object ( 
      [@attributes] => Array ( [id] => AF ) 
      [name] => AFGHANISTAN 
      [ssc] => ASI 
    ) ...
  )

等等。这是我的代码:

function generateCountryList() {
  global $server_path;
  // the following line generates - correctly - the object I gave above
  $cxml = simplexml_load_file($server_path . 'countries/');  
  $c = array();
  foreach ($cxml->country as $cntry => $rec) {
    $rid = $rec['id'];
    $rname = ucwords(strtolower($rec->name));
    //the following echo statements are for debugging only
    echo $rid;  //returns the country ID; for example, AD on the 0th element in the object
    echo $rname;  //returns the country name; for example, Andorra on the 0th element in the object
    $c[$rid] = $rname;  //the goal here is to have an array of the form    
                        //['AD'=>'Andorra','AE'=>'United Arab Emirates',...]
 }
return $c;
}

如果我返回$c并将其分配给一个变量,那么print_r该变量,我得到一个空数组。如果我print_r($c);在这个函数中运行,我会得到同样的结果。

我很感激有人可以提供任何帮助,说明为什么我无法构建这个阵列!

4

1 回答 1

1

当您使用 导航到 SimpleXML 对象的子节点时$element->elementName,您会得到另一个 SimpleXML 对象,以便您可以从那里继续导航。要获取子节点的字符串内容,请使用 PHP 字符串转换运算符:(string)$element->elementName

不太明显的是,当您使用 导航到一个属性$element['attribName'],它还会为您提供另一个 SimpleXML 对象。除了字符串内容之外,您对该对象没有太多想要的东西,但$attrib->getName()例如,您可能希望在循环内调用。同样,要获取字符串内容,您必须使用(string)$element['attribName'],正如您所发现的那样。

现在,PHP 中的一些函数和构造,例如echo 隐式转换为 string,因为根本没有其他数据类型可以与它们一起使用。但是,与其确切了解它们是什么,并在更改代码时增加混乱,我的建议是始终将任何 SimpleXML 结果显式地转换为字符串(string)

最后一点:您还可以使用 . 从内容中获取整数值(int),使用(float). 但是,在总和中使用对象,例如$element['attribName'] * 1.0将始终将其转换为整数,无论​​涉及什么值。同样,显式转换将导致更少的意外。

于 2013-01-30T18:56:15.897 回答