1

我的站点中有一个页面,我必须在其中解析 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++;
            }
}
}
4

2 回答 2

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()
);
于 2013-06-06T13:41:44.283 回答
0

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

也许我不明白你在做什么,但 $hotel_array($id) 首先不应该是一个普通数组($hotel_array[$id] = array();就是这样)?然后你可以毫无问题地在里面构建一个嵌套数组。

于 2013-06-06T12:01:12.160 回答