сортировать xml div по дочернему узлу PHP SimpleXML - PullRequest
0 голосов
/ 26 ноября 2011

, поэтому у меня есть список <div> в xml-файле. Я анализирую файл с помощью php's simpleXML

Я могу сгенерировать массив всех элементов div со следующим:

$divArray = $xmldoc->text->body->children();

Но теперь я бы хотел заказать $ divArray различными дочерними узлами (автор, заголовок, дата) внутри div.

Div выглядит следующим образом.

<div>
    <bibl>
       <author>
       <title>
       <date>
   </bibl>
</div>

Так, как я могу взять $ divArray и отсортировать его по <author> или <title> или <date>?

Спасибо за вашу помощь. JW

1 Ответ

5 голосов
/ 26 ноября 2011

Основная процедура

  1. приведение SimpleXMLElement в массив
  2. написать функцию сравнения, которая принимает два SimpleXMLElement аргумента
  3. отсортировать массив с помощью функции сравнения, используя usort()

Я могу только догадываться о вашей исходной структуре XML, но я думаю, что это выглядит примерно так:

$xml = <<<EOT
<root>
<text>
    <body>
        <div>
            <bibl>
                <author>A</author>
                <title>A</title>
                <date>1</date>
            </bibl>
        </div>
        <div>
            <bibl>
                <author>B</author>
                <title>B</title>
                <date>2</date>
            </bibl>
        </div>
        <div>
            <bibl>
                <author>D</author>
                <title>D</title>
                <date>4</date>
            </bibl>
        </div>
        <div>
            <bibl>
                <author>C</author>
                <title>C</title>
                <date>3</date>
            </bibl>
        </div>
    </body>
</text>
</root>
EOT;

$xmldoc = new SimpleXMLElement($xml);

Шаг 1: приведение к массиву. Обратите внимание, что ваш $divArray на самом деле не является массивом !

$divSXE = $xmldoc->text->body->children(); // is a SimpleXMLElement, not an array!
// print_r($divSXE);
$divArray = array();
foreach($divSXE->div as $d) {
    $divArray[] = $d;
}
// print_r($divArray);

Шаг 2: написать функцию сравнения. Поскольку массив является списком SimpleXMLElement с, функция сравнения должна принимать SimpleXMLElement аргументов. SimpleXMLElement s требуется явное приведение для получения строковых или целочисленных значений.

function author_cmp($a, $b) {
    $va = (string) $a->bibl->author;
    $vb = (string) $b->bibl->author;
    if ($va===$vb) {
        return 0;
    }
    return ($va<$vb) ? -1 : 1;
}

Шаг 3: Сортировать массив с usort()

usort($divArray, 'author_cmp');
print_r($divArray);
...