Объекты группировки php simplexml

Прежде чем начать, я хотел бы сказать, что я читаю XML в PHP, но до сих пор мне удалось загрузить XML и отобразить данные на странице PHP. Мой следующий тест – это групповые элементы.

Вот фрагмент XML:

<MailboxDatabases> <MailboxDatabase> <DatabaseName>DB01</DatabaseName> <Status>Healthy</Status> <MailboxServer>MB08</MailboxServer> <ActiveDatabaseCopy>mb07</ActiveDatabaseCopy> <ActivationSuspended>False</ActivationSuspended> <SinglePageRestore>0</SinglePageRestore> <ContentIndexState>Healthy</ContentIndexState> <Active>false</Active> </MailboxDatabase> <MailboxDatabase> <DatabaseName>DB01</DatabaseName> <Status>Healthy</Status> <MailboxServer>MB07</MailboxServer> <ActiveDatabaseCopy>mb07</ActiveDatabaseCopy> <ActivationSuspended>False</ActivationSuspended> <SinglePageRestore>0</SinglePageRestore> <ContentIndexState>Healthy</ContentIndexState> <Active>true</Active> </MailboxDatabase> <MailboxDatabases> <MailboxDatabase> <DatabaseName>DB02</DatabaseName> <Status>Healthy</Status> <MailboxServer>MB08</MailboxServer> <ActiveDatabaseCopy>mb07</ActiveDatabaseCopy> <ActivationSuspended>False</ActivationSuspended> <SinglePageRestore>0</SinglePageRestore> <ContentIndexState>Healthy</ContentIndexState> <Active>true</Active> </MailboxDatabase> <MailboxDatabase> <DatabaseName>DB02</DatabaseName> <Status>Healthy</Status> <MailboxServer>MB07</MailboxServer> <ActiveDatabaseCopy>mb07</ActiveDatabaseCopy> <ActivationSuspended>False</ActivationSuspended> <SinglePageRestore>0</SinglePageRestore> <ContentIndexState>Healthy</ContentIndexState> <Active>false</Active> </MailboxDatabase> </MailboxDatabases> 

Как вы можете видеть, «DatabaseName» одинаково для двух элементов, но «Active» отличается. То, что я хочу сделать, это показать выше xml в php, как

DB01 – MB08 – false | DB01 – MB07 – true

DB02 – MB08 – true | DB01 – MB07 – false

используя следующие элементы (база данных) – (Mailboxserver) – (активный) | …

Пожалуйста, может кто-то дать мне руку, а также попробуйте объяснить код.

Общая стратегия:

  1. создайте список уникальных групп, то есть <DatabaseName>
  2. выберите все <MailboxDatabase> , принадлежащие группе, и выполните эхо их <MailboxServer> и <Active>
  3. перейдите к следующей группе и перейдите к шагу 2, пока не повторите все группы.

Пришло время узнать о выборе определенных узлов из XML, и это лучше всего сделать с помощью xpath . Короче говоря, xpath предназначен для XML, что SQL для баз данных.

Допустим, у вас есть объект SimpleXML :

 $xml = simplexml_load_string($x); // assume XML in $x 

создать список уникальных групп

Получите все <DatabaseName> в массиве:

 $groups = $xml->xpath("/MailboxDatabases/MailboxDatabase/DatabaseName"); 

$groups SimpleXML содержит массив элементов SimpleXML , поэтому давайте сделаем некоторую магию массива, чтобы преобразовать их в строки:

 $groups = array_map("strval", $groups); 

Результат ( var_dump ):

 array(4) { [0]=> string(4) "DB01" [1]=> string(4) "DB01" [2]=> string(4) "DB02" [3]=> string(4) "DB02" } 

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

 $groups = array_flip(array_flip($groups)); 

Результат:

 array(2) { [1]=> string(4) "DB01" [3]=> string(4) "DB02" } 

Это оно. Напишите его как одну строку:

 $groups = array_flip(array_flip(array_map("strval", $xml->xpath("//MailboxDatabase/DatabaseName")); 

BTW: // в начале этого оператора xpath является подстановочным знаком

выбирать узлы по группам

Снова xpath , на этот раз с условием для выбора только тех <MailboxDatabase> которые совместно используют те же <DatabaseName> . Обратите внимание на условие в [] :

 $elements = $xml->xpath("/MailboxDatabases/MailboxDatabase[DatabaseName = '$group']"); 

Теперь итерация над $groups :

 foreach ($groups as $group) { echo "group $group:" . PHP_EOL; $elements = $xml->xpath("//MailboxDatabase[DatabaseName = '$group']"); foreach ($elements as $e) echo " " . $e->MailboxServer . ": " . $e->Active . PHP_EOL; echo PHP_EOL; } 

Результат:

 group DB01: MB08: false MB07: true group DB02: MB08: true MB07: false 

см. его работу: https://eval.in/321935