使用foreach将值分配给PHP数组时遇到问题

时间:2013-01-30 03:01:45

标签: php arrays simplexml

我遇到了一个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);,我会得到同样的结果。

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

1 个答案:

答案 0 :(得分:1)

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

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

现在,PHP中的一些函数和结构,例如echo 隐式转换为字符串,因为根本没有其他数据类型可供它们使用。但是,我建议不要直接了解这些内容,并在更改代码时添加混淆,而是始终使用(string) 明确地将任何SimpleXML结果转换为字符串。

最后一点说明:您还可以使用(int)从内容中获取整数值,使用(float)获取浮点数。但是,使用总和中的对象(例如$element['attribName'] * 1.0)将始终将其转换为整数,无论​​涉及何种值。同样,明确的演员阵容将减少意外。