Разбор XML атрибутов и значений в PHP ассоциативный массив - PullRequest
0 голосов
/ 02 апреля 2020

Учитывая XML в следующем формате

<?xml version="1.0"?>
<table>
 <row id="515" employeeId="7">
  <field id="startDate">2016-03-28</field>
  <field id="rate" currency="USD">15.00</field>
  <field id="type">Hourly</field>
  <field id="exempt"></field>
  <field id="reason"></field>
  <field id="comment"></field>
  <field id="paidPer">Hour</field>
  <field id="paySchedule">Monthly</field>
 </row>
 <row id="1917" employeeId="7">
  <field id="startDate">2017-09-11</field>
  <field id="rate" currency="USD">2500.00</field>
  <field id="type">Salary</field>
  <field id="exempt">Exempt</field>
  <field id="reason">Equity Adjustment</field>
  <field id="comment">Increase for 2017 performance</field>
  <field id="paidPer">PayPeriod</field>
  <field id="paySchedule">Every other week</field>
 </row>
</table>

$node3 = simplexml_load_string($prates, "SimpleXMLElement", LIBXML_NOCDATA);
foreach($node3->row as $r) {
            for($i=0;$i<count($r);$i++) {
            var_dump($r->field[$i]["id"][0]);
            }

возвращает мой список атрибутов id для моего XML.
Учитывая, что обычный метод кодирования JSON / decode XML не сохранить атрибуты, и в конечном итоге мне нужен массив, который выглядит как

$ rate [0] [first id] => значение этого поля

$ rate [0] [second id ] => значение этого поля

и, если в XML

$ норм есть вторая строка [1] [первый идентификатор] => значение этого поля

et c, чтобы я мог затем отсортировать массив по startDates, чтобы найти самую последнюю строку. Есть ли более простой способ сделать это? Я чувствую, что слишком долго на это смотрю ...

1 Ответ

0 голосов
/ 03 апреля 2020

Вы можете сделать двойной l oop: один для каждой строки и второй для каждого поля в текущей строке:

$rates = array() ; // store data of the whole document
foreach($node3 as $row) // loop over each row
{
    $rowData = array() ; // store the current row data
    foreach($row->field as $field) // loop over each field
    {
        $id = (string) $field->attributes()['id'] ; // retrieve the 'id' attribute
        $value = (string) $field ; // retrieve the text inside the node

        $rowData[$id] = $value ; // add the id/value pair
    }

    $rates[] = $rowData ; // add the row data to the global array
}

print_r($rates);

Выход:

Array
(
[0] => Array
    (
        [startDate] => 2016-03-28
        [rate] => 15.00
        [type] => Hourly
        [exempt] => 
        [reason] => 
        [comment] => 
        [paidPer] => Hour
        [paySchedule] => Monthly
    )

[1] => Array
    (
        [startDate] => 2017-09-11
        [rate] => 2500.00
        [type] => Salary
        [exempt] => Exempt
        [reason] => Equity Adjustment
        [comment] => Increase for 2017 performance
        [paidPer] => PayPeriod
        [paySchedule] => Every other week
    )
)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...