我遇到了一个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);
,我会得到同样的结果。
我很感激有人可以提供帮助,说明为什么我无法构建这个数组!
答案 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
)将始终将其转换为整数,无论涉及何种值。同样,明确的演员阵容将减少意外。