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;

ただし、2 番目の問題があります。$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 に答える