2013-09-30 3 views
0

Я недавно пробовал простую вещь с PHP-писателем PHP, чтобы вывести вызовы db более кросс-платформенным способом - с помощью xml. Дело в том, что я хотел бы преобразовать многосайтовый is_array и Foreach петлю в какое-то петле:Многоуровневый php-массив xml writer?

$arr = array('param'=>'value','otherparam'=>array('vegetable'=>'tomato')); 
    $xml = new XMLWriter(); 
    $xml->openURI("php://output"); 
    $xml->startDocument(); 
    $xml->setIndent(true); 
    $xml->startElement('whmseo'); 
    $xml->startElement($module); 
    foreach($arr as $fkey=>$fel) 
    { 
     if(is_array($fel)) 
     { 
      foreach($fel as $skey=>$sel) 
      { 
       if(is_array($sel)) 
       { 
        foreach($sel as $tkey=>$tel) 
        { 
         $xml->startElement($tkey); 
         $xml->writeRaw($tel); 
         $xml->endElement(); 
        } 
       } 
       else 
       { 
        $xml->startElement($skey); 
        $xml->writeRaw($sel); 
        $xml->endElement(); 
       } 
      } 
     } 
     else 
     { 
      $xml->startElement($fkey); 
      $xml->writeRaw($fel); 
      $xml->endElement(); 
     } 
    } 
    $xml->endElement(); 
    $xml->endElement(); 
    header('Content-type: text/xml'); 
    $xml->flush(); 
    exit(); 

Как сделать это в какой-то простой итерации?

+0

Вы хотите, чтобы сделать его рекурсивным? – OIS

+0

Да, это правильно :-) – jakubplus

ответ

1

Что-то вроде этого? Я не могу проверить на XMLWriter атм ..

function xmlrecursive($xml, $key, $value) { 
    if (is_array($value)) { 
     $xml->startElement($key); 
     foreach ($value as $key => $sub) { 
      xmlrecursive($xml, $key, $sub); 
     } 
     $xml->endElement(); 
    } else { 
     $xml->startElement($key); 
     $xml->writeRaw($value); 
     $xml->endElement(); 
    } 
} 

$arr = array('param'=>'value','otherparam'=>array('vegetable'=>'tomato')); 
$xml = new XMLWriter(); 
$xml->openURI("php://output"); 
$xml->startDocument(); 
$xml->setIndent(true); 
$xml->startElement('whmseo'); 
//$xml->startElement($module); 
foreach ($value as $key => $sub) { 
    xmlrecursive($xml, $key, $sub); 
} 
//$xml->endElement(); 
$xml->endElement(); 
header('Content-type: text/xml'); 
$xml->flush(); 
exit(); 

Выход:

<?xml version="1.0"?> 
<whmseo> 
<test> 
    <param>value</param> 
    <otherparam> 
    <vegetable>tomato</vegetable> 
    </otherparam> 
</test> 
</whmseo> 
+0

Ну, кажется, что по этой части: Еогеаспа ($ значения, как $ ключа ... это занимает элемент массива второго уровня, и не обрабатывает ключи т.е. дб // Это должно содержать массив И я думаю, что «Еогеасп ($ Вэл ue как $ key => $ sub) {«должно быть» foreach ($ arr as $ key => $ sub) {«по моему вопросу, я прав? – jakubplus

+0

@jakubplus ah .. нет в зависимости от вашего кода. Я проверю. – OIS

+0

@jakubplus это работает – OIS

0

Не является прямым ответом на ваш вопрос, но я настоятельно рекомендую использовать JSON. Это просто кросс-платформенная совместимость как XML, но менее сложная и менее громоздкая для работы. Это в значительной степени метод сериализации для современных веб-сервисов.

С JSON, ваш код будет такое:

header('Content-type: application/json'); 
$arr = array('param'=>'value','otherparam'=>array('vegetable'=>'tomato')); 
echo json_encode($arr); 
+0

Ну, я использую json_encode json_decode для моих работ, но на этот раз мне нужно использовать xml в частности. Спасибо за напоминание :-) – jakubplus

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