Разбор нескольких XML-каналов с PHP в один отсортированный массив - PullRequest
3 голосов
/ 09 апреля 2009

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

  • $ VAR1 [0], $ VAR2 [0] ...
  • $ VAR1 [1], $ VAR2 [1] ...

Данные поступают из нескольких одинаковых структурированных XML-файлов:

$xmlfile="
<Level1>
 <Level2>
  <Level2Item VAR1="1" VAR2="2" ... />
  <Level2Item VAR1="4" VAR2="5" ... />
  <Level2Item VAR1="7" VAR2="8" ... />
 </Level2>
</Level1>";

//Extract each item
$xml = new SimpleXMLElement($xmlfile);
foreach ($xml->Level2[0] as $result) {
 array_push($VAR1Array, $result['VAR1']);
 array_push($VAR2Array, $result['VAR2']);
 //... etc etc
}
//sort
//$sortedArray = sort($VAR1Array);

Выход

Array(
  [0] => SimpleXMLElement Object([0] => 1)
  [1] => SimpleXMLElement Object([0] => 4)
  [2] => SimpleXMLElement Object([0] => 7)
)

Как лучше всего хранить данные в одном массиве из этой структуры XML? Я хочу иметь возможность собрать все данные в один массив, чтобы я мог отсортировать их по одному или двум VAR и отобразить результаты.

Ответы [ 4 ]

2 голосов
/ 24 мая 2009

Я не совсем уверен, какую сортировку вы пытаетесь сделать (вы должны указать с некоторыми примерами). Но оптимально, вы не будете загружать фрагменты XML в ваш массив.

$xmlfile="
<Level1>
 <Level2>
  <Level2Item VAR1="1" VAR2="2" ... />
  <Level2Item VAR1="4" VAR2="5" ... />
  <Level2Item VAR1="7" VAR2="8" ... />
 </Level2>
</Level1>";

//Extract each item
$xml = new SimpleXMLElement($xmlfile);
foreach ($xml->Level2[0] as $result) {
 $VAR1Array[] = (int) $result['VAR1'];
 $VAR2Array[] = (int) $result['VAR2'];
 //... etc etc
}

Last, sort() работает по ссылке, поэтому не приравнивайте ее к переменной (то есть просто скажите sort($array); как всю строку, и тогда $array будет отсортировано. Если вы приведете как int s Как и в предыдущем примере, вы можете использовать функцию сортировки по умолчанию в php, не используя пользовательскую функцию сравнения, как предлагали другие. И array_push немного медленнее и сложнее для чтения, чем использование синтаксиса php $var[] для добавления нового элемент в массив.

1 голос
/ 09 июля 2009

Кроме того, я полностью уверен, что вы не можете назначить $ xmlfile таким образом (делая двойные кавычки без экранирования внутри двойных кавычек.

В этом коде лучший способ определить $ xmlfile:

$xmlfile = <<<XML
<Level1>
 <Level2>
  <Level2Item VAR1="1" VAR2="2" ... />
  <Level2Item VAR1="4" VAR2="5" ... />
  <Level2Item VAR1="7" VAR2="8" ... />
 </Level2>
</Level1>
XML;

или

$xmlfile = '
<Level1>
 <Level2>
  <Level2Item VAR1="1" VAR2="2" ... />
  <Level2Item VAR1="4" VAR2="5" ... />
  <Level2Item VAR1="7" VAR2="8" ... />
 </Level2>
</Level1>';
0 голосов
/ 09 апреля 2009
$xml = simplexml_load_file(...);

$table = array();
foreach ($xml->Level2[0] as $result)
    $table[] = $result->attributes();

function cmp_row($a, $b, $sortColumn)
{
    if ($a == $b)
        return 0;

    return ($a < $b) ? -1 : 1;
}

$sortColumn = 'VAR1'; // make sure it's a clean string

uasort($table, create_function('$a,$b', 'return cmp_row($a, $b, "'.$sortColumn.'")'));

Вы также можете сохранить SimpleXMLElements и сортировать их напрямую, если хотите, как сказал Апинштейн.

0 голосов
/ 09 апреля 2009

На вашем месте я просто поместил бы все элементы SimpleXMLE в массив, а затем использовал бы uasort () с пользовательской функцией обратного вызова для сортировки по вашему желанию. Это работает?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...