2016-01-05 2 views
0

У меня есть следующий XML $ результатацикл через PHP XML_Parser и превратить в массив для удобства

<Response> 
     [.....] 
     <Questions> 
      <Question type="1" text="Which one of their favorite color?"> 
       <Answer correct="false">RED</Answer> 
       <Answer correct="false">BLUE</Answer> 
       <Answer correct="true">BLACK</Answer> 
       <Answer correct="false">YELLOW</Answer> 
      </Question> 
      <Question type="2" text="What is their favorite food?"> 
       <Answer correct="false">PIZZA</Answer> 
       <Answer correct="false">TACOS</Answer> 
       <Answer correct="true">CAKE</Answer> 
       <Answer correct="false">CHEESE</Answer> 
      </Question> 
      <Question type="3" text="Which person do they hate the most?"> 
       <Answer correct="false">Bill</Answer> 
       <Answer correct="true">Jack</Answer> 
       <Answer correct="false">Jammie</Answer> 
       <Answer correct="false">Rick</Answer> 
      </Question>     
     </Questions> 
    </Response> 

Я знаю, что я хотел бы использовать ...

$xml = simplexml_load_string($result); 

Это установит $ XML к результату объекта SimpleXML. Я хотел бы знать, как лучше всего перебирать текст этих вопросов, чтобы я мог потянуть все вопросы и добавить их в массив, а затем легко ссылаться на них по типу #, текст вопроса и отвечать, поэтому я могу просто сделать

$QuestionText = $array["1"]["text"] //Which one is their favorite color? 
$QuestionAnswer = $array["1"]["answer"] //BLACK 

EDIT # 1

в то время как у меня не было ответа назад еще я пытался понять это сам, и я изменил свой метод к XML_Parser ...

$xml_parser = xml_parser_create(); 
xml_parser_set_option($xml_parser,XML_OPTION_CASE_FOLDING,0); 
xml_parser_set_option($xml_parser,XML_OPTION_SKIP_WHITE,1); 
xml_parse_into_struct($xml_parser, $result, $vals,$index); 
xml_parser_free($xml_parser); 

    $newResArr = array(); 
     foreach($vals as $val) 
     { 
      if(($val['tag']=='Question')) { 
       if(isset($val['attributes'])){ 
        $type = $val['attributes']['type']; 
        $newResArr[$type]['text'] = $val['attributes']['text']; 
         //I assume a foreach needs to be put here? 
        } 
       } 
     } 

Теперь я могу ссылаться на текст, выполняя $ newRes Arr ['1'] ['text'], и я получаю то, что хочу, однако я не знаю, как настроить цикл foreach, как описано выше, чтобы вывести ответ, если для его атрибута установлено значение true.

+0

Вы действительно хотите преобразовать и получить доступ к нему в виде массива? –

+0

Lol, да вот почему я пытаюсь это сделать :) – eqiz

+0

потому что simplexml_load_string возвращает объект, и вы можете получить доступ к объекту, хотя его не массив –

ответ

1

Я не говорю, что это лучший ответ, но я думаю, что это может вам помочь. Пожалуйста, обратите внимание, что я добавил <text> тег.

<?php 
$result ='<Response> 
     <Questions> 
      <Question type="1" text="Which one of their favorite color?"> 
       <Answer type="1" correct="false"><text>RED</text></Answer> 
       <Answer type="1" correct="false"><text>BLUE</text></Answer> 
       <Answer type="1" correct="true"><text>BLACK</text></Answer> 
       <Answer type="1" correct="false"><text>YELLOW</text></Answer> 
      </Question> 
      <Question type="2" text="What is their favorite food?"> 
       <Answer correct="false"><text>PIZZA</text></Answer> 
       <Answer correct="false"><text>TACOS</text></Answer> 
       <Answer correct="true"><text>CAKE</text></Answer> 
       <Answer correct="false"><text>CHEESE</text></Answer> 
      </Question> 
      <Question type="3" text="Which person do they hate the most?"> 
       <Answer correct="false"><text>Bill</text></Answer> 
       <Answer correct="true"><text>Jack</text></Answer> 
       <Answer correct="false"><text>Jammie</text></Answer> 
       <Answer correct="false"><text>Rick</text></Answer> 
      </Question>     
     </Questions> 
    </Response>'; 
//Will convert Object data to array 
function objectToArray($object){ 
    return json_decode(json_encode($object),true,512,0); 
} 

$xml = objectToArray(simplexml_load_string($result)); 

$array = $xml['Questions']['Question'][0]; 
$QuestionText = $array['@attributes']['text'];//Which one is their favorite color? 
$QuestionAnswer = $array['Answer']; 

foreach ($QuestionAnswer as $value) { 
    if($value['@attributes']['correct'] == 'true'){ 
     echo 'The correct answer is '.$value['text']; 
    } 
} 
echo '<pre>'; 
print_r($array); 
//You can also try to print the whole array 
print_r($xml); 
echo '</pre>'; 

Я надеюсь, что это поможет.

Смежные вопросы