Доступ к узлу XML напрямую через ключ - PullRequest
1 голос
/ 15 сентября 2010
$xml = simplexml_load_file($xmlPath);
$items = $xml->list->item;
...
echo $items[$currentIndex]->asXML();

Когда я печатаю $ currentIndex на каждой итерации, я получаю 0, 1, 2, 3, 4 и т. Д. Когда я жестко кодирую $ items [0] -> asXML (); $ пунктов [1] -> asXML (); $ пунктов [2] -> asXML (); и т. д. Я получаю нужные данные.

Но когда я зацикливаюсь, как в первом сегменте кода, он печатает элементы 0, 2, 4 и т. Д.

Как это возможно и что может быть причиной этого?

Спасибо, Райан

ДОБАВЛЕННАЯ ИНФОРМАЦИЯ:

Это основная часть:

$totalItems = 45;
$keepItems = 10;
$currentIndex = 0;

while($totalItems > $keepItems)
{
    $totalItems -= 1;
    print_r($xml->list->item[$currentIndex]);
    $currentIndex += 1;
}

Я только что попробовал это в отдельном файле, и он работал в этом случае:

$xml = simplexml_load_file($xmlPath);
$items = $xml->list->item;

$counter = 45;
$display = 0;

while($counter > 4)
{
    echo $items[$display]->asXML();

    $display += 1;
    $counter -= 1;
}

Так что-то в моем другом коде делает это возможным. Мне нужно еще взглянуть на это, но в этом нет ничего очевидного.

Спасибо, Райан

ДОБАВЛЕННАЯ ИНФОРМАЦИЯ 2:

ОК, я определила строку кода, которая вызывает синдром «каждый второй» :) 1066 *

unset($items[$currentIndex]);

Идея заключалась в том, чтобы удалить / сбросить элемент после того, как я использовал данные, но, похоже, он работает не так, как я ожидал - кто-нибудь знает, почему? Почему он сбрасывает то, что не отображал?

Спасибо, Ryan

1 Ответ

1 голос
/ 16 сентября 2010

Why is it unsetting something it hasn't displayed? Это не то, что происходит в вашем случае. Когда вы отменяете обработанный элемент, данные массива сдвигаются ... прежний элемент с индексом 1 получает индекс 0, 2 смещается на 1 и так далее. Таким образом, если вы получите доступ к $ element [1] после того, как у вас не установлено $ element [0], вы получите элемент, который был в позиции $ element [2], потому что прежний $ element [1] переместился в $ element [0] $ element [2] to $ element [1].

Если вы всегда сбрасываете обработанный элемент, вы можете сделать это, обращаясь к $ element [0] на каждой итерации и отмените, если массив пуст.


// ...
while ($array) {               // same as count($array)
  $currentElement = $array[0];
  // do something
  unset($array[0]);
}
// ...
...