Проблема с массивом XML в PHP - столбцы объединяются в одну строку вместо нескольких строк - PullRequest
0 голосов
/ 04 февраля 2019

Я прошел все предыдущие вопросы и не могу найти решение, которое работает.Я не работал с XML в прошлом, и я немного запутался.Я знаю, что при печати simplexml вы не видите все данные, но я не могу получить данные, чтобы получить их так, как я хочу.

Данные, которые я собрал из запроса CURL, который возвращает только XML,следующее:

<result>
  <header>
    <col>
      <label>Account Id</label>
    </col>
    <col>
      <label>Employee Id</label>
    </col>
    <col>
      <label>Username</label>
    </col>
    <col>
      <label>First Name</label>
    </col>
    <col>
      <label>Last Name</label>
    </col>
    <col>
      <label>New Status</label>
    </col>
    <col>
      <label>Old Status</label>
    </col>
    <col>
      <label>Changed</label>
    </col>
    <col>
      <label>Email</label>
    </col>
  </header>
    <body>
      <row>
      <col>4346088504</col>
      <col>6534</col>
      <col>Nalini.LastName</col>
      <col>Nalini</col>
      <col>LastName</col>
      <col>Terminated</col>
      <col>Active</col>
      <col>02/01/2019 12:58p</col>
      <col>email1</col>
    </row>
    <row>
      <col>32103136</col>
      <col>2835</col>
      <col>Karen.LastName</col>
      <col>Karen</col>
      <col>LastName/col>
      <col>Inactive</col>
      <col>LOA</col>
      <col>02/01/2019 07:27a</col>
      <col>email2</col>
    </row>
    <row>
      <col>4348430099</col>
      <col>6652</col>
      <col>elouise.LastName</col>
      <col>Elouise</col>
      <col>LastName</col>
      <col>Active</col>
      <col>LOA</col>
      <col>02/01/2019 07:20a</col>
      <col>email3</col>
    </row>
  </body>
 <footer/>
</result>

Возвращается в виде строки и сохраняется в переменной $ result следующим образом

$result = simplexml_load_string(curl_exec($ch));
$result = $result->body;

Не вдаваясь в длинную касательную, я пробовал много разных итераций / цикловчтобы получить это в следующей структуре со всеми полями, а не только с примерами, которые я набрал:

           $result = array(
                'employees' => array(
                    array(
                        'KronosUniqueID' => '4346088504',
                        'KronosID' => '6534',
                        'FirstName' => 'Nalini',
                        'LastName' => 'LastName'
                    ),
                    array(
                        'KronosUniqueID' => '32103136',
                        'KronosID' => '2835',
                        'FirstName' => 'Karen',
                        'LastName' => 'LastName'
                    )
                    array(
                        'KronosUniqueID' => '4348430099',
                        'KronosID' => '6652',
                        'FirstName' => 'Elouise',
                        'LastName' => 'LastName'
                    )
                )
            );

Некоторая помощь будет принята с благодарностью.Конечный результат также может быть объектом, если это предпочтительнее.

1 Ответ

0 голосов
/ 04 февраля 2019

Вот базовая реализация для извлечения данных. Поскольку вы переименовываете поля, вам придется делать это вручную.Разверните отображение, чтобы получить нужные данные.

$simpleXML = simplexml_load_string( $xml );
$output = array();
foreach( $simpleXML->xpath('//body/row') as $row )
{
  $output[] = array(
    'KronosUniqueID' => (int) $row->col[0],
    'KronosID' =>  (int) $row->col[1],
    'FirstName' => (string) $row->col[3],
    'LastName' => (string) $row->col[4],
  );
}

Вот «автоматическая» версия с использованием меток с исправлением меток.

$simpleXML = simplexml_load_string( $xml );

$labels = (array) $simpleXML->xpath('//header/col/label');
$labels[0] = 'KronosUniqueID';
$labels[1] = 'KronosID';
$labels = array_map( function( $string ){ return str_replace( ' ', '', $string ); }, $labels ); // removes space character

$output = array();
foreach( $simpleXML->xpath('//body/row') as $row )
{
  $output[] = array_combine( $labels, (array) $row->col );
}
...