间接修改SimpleXMLElement的重载元素无效

时间:2013-06-06 11:12:00

标签: php xml xml-parsing simplexml

我的网站中有一个页面,我必须解析xml并将结果插入到数组中。 但是当我尝试插入阵列室时,我有这个错误:

Indirect modification of overloaded element of SimpleXMLElement has no effect

错误在这一行:

$hotel_array[$id]['rooms'][$i] = $room_array;

这是我的代码:

$hotel_array = array(); 
//$xml->data is a valid xml parsed with simpleXML
foreach ($xml->DATA as $entry){
foreach ($entry->HOTEL_DATA as $entry2){
    $id = (string)$entry2->attributes()->HOTEL_CODE;
    if($entry2->attributes()->HOTEL_CODE=='YYG'){
         $exist = 0;
         if (array_key_exists('YYG', $hotel_array))
        $exist = 1;

         $hotel_array[$id] = $entry2->attributes()->HOTEL_CODE;
             $i=0;
         foreach($entry2->ROOM_DATA as $room){
        $room_array = array();
        $room_array['id'] = $room->attributes()->CCHARGES_CODE;
        $room_array['code'] = $room->attributes()->ROOM_CODE;
        $room_array['name'] = utf8_decode($room->ROOM_NAME);
>attributes()->NO_OF_EXTRA_BEDS;
        $hotel_array[$id]['rooms'][$i] = $room_array;
        $i++;
            }
}
}

2 个答案:

答案 0 :(得分:3)

你看到的第一个问题是这条线没有达到你想要的效果:

$hotel_array[$id] = $entry2->attributes()->HOTEL_CODE;

每当您访问SimpleXML对象的子元素或属性时,您获得的是另一个SimpleXML对象。所以在本声明的最后,$hotel_array[$id]指向SimpleXML对象。然后,当您尝试将其他详细信息分配给$hotel_array[$id]时,PHP认为您正在尝试以不受支持的方式修改XML本身,从而导致您看到的错误。

我认为您真正想要的是获取该属性的内容,作为普通的PHP字符串。这样做的方法是使用(string)$variable转换为字符串:

$hotel_array[$id] = (string)$entry2->attributes()->HOTEL_CODE;

然而,你又遇到了第二个问题:$hotel_array[$id]现在是一个字符串,但是稍后你会尝试将它作为一个数组来处理:

$hotel_array[$id]['rooms'][$i] = $room_array;

查看代码时,$id已设置为(string)$entry2->attributes()->HOTEL_CODE,并存储为$hotel_array条目的键,因此我不确定为什么需要分配它再一次,但如果你这样做,它不能与包含['rooms']键的数组位于同一个地方。相反,您需要其中一行:

# Just create an empty hash with the key as the hotel code
$hotel_array[$id] = array();

# Add the hotel code into the array, next to the 'rooms' key
$hotel_array[$id]['code'] = (string)$entry2->attributes()->HOTEL_CODE;

# Above combined into one array initialisation, including empty 'rooms' array
$hotel_array[$id] = array(
    'code' => (string)$entry2->attributes()->HOTEL_CODE,
    'rooms' => array()
);

答案 1 :(得分:0)

在我看来,您正在尝试在已经表示属性本身(['rooms'])的SimpleXML元素上设置属性($hotel_array[$id])。

也许我没有得到你想要的东西,但不应该$ hotel_array($ id)首先是一个普通的数组($hotel_array[$id] = array();,那就是它)?然后你可以在里面构建一个嵌套数组而没有问题。