php loop не работает должным образом - PullRequest
0 голосов
/ 03 ноября 2010

Я пытаюсь заменить все идентификаторы атрибутов сразу из '$ old'> '$ new', а затем сохранить XML:

$reorder = array( 9=>"8", 8=>"5", 7=>"4", 6=>"3", 5=>"0", 4=>"1", 3=>"9", 2=>"7", 1=>"2", 0=>"6" );

    $objDOM = new SimpleXMLElement(some.xml, null, true);
    foreach ($reorder as $old => $new) {
       $picture = $objDOM->xpath('picture[@id="'.$old.'"]');
       $picture[0]["id"] = $new;
    }
    echo $objDOM->asXML();

Результат ниже (не соответствует массиву $ reorder)

  • 3> 9
  • 9> 6
  • 8> 8
  • 7> 2
  • 6> 3
  • 5> 5
  • 4> 4
  • 0> 0
  • 1> 1
  • 7> 2

Кажется, что происходит последовательное переключение идентификаторов, поэтому только что переключенные идентификаторы переключаются снова, если они появляются позже в массиве.

Что я там не так делаю? Как я могу заставить его переключать ВСЕ идентификаторы за один раз?

Спасибо ... Andy

Ответы [ 2 ]

2 голосов
/ 03 ноября 2010

Ответ две петли

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

$reorder = array(9 => "8", 8 => "5", 7 => "4", 6 => "3", 5 => "0", 4 => "1", 3 => "9", 2 => "7", 1 => "2", 0 => "6");

$objDOM = new SimpleXMLElement(
      '<pictures>
    <picture id="9">id was 9, should be 8 now</picture>
    <picture id="8">id was 8, should be 5 now</picture>
    <picture id="7">id was 7, should be 4 now</picture>
    <picture id="6">id was 6, should be 3 now</picture>
    <picture id="5">id was 5, should be 0 now</picture>
    <picture id="4">id was 4, should be 1 now</picture>
    <picture id="3">id was 3, should be 9 now</picture>
    <picture id="2">id was 2, should be 7 now</picture>
    <picture id="1">id was 1, should be 2 now</picture>
    <picture id="0">id was 0, should be 6 now</picture>
</pictures>');
$oldPicIds = array();

foreach ($reorder as $old => $new) {
   $oldPicIds[$old] = $objDOM->xpath('picture[@id="' . $old . '"]');
}

foreach ($reorder as $old => $new) {
   $oldPicIds[$old][0]['id'] = $new;
}

echo $objDOM->asXML();

Выход:

<?xml version="1.0"?>
<pictures>
    <picture id="8">id was 9, should be 8 now</picture>
    <picture id="5">id was 8, should be 5 now</picture>
    <picture id="4">id was 7, should be 4 now</picture>
    <picture id="3">id was 6, should be 3 now</picture>
    <picture id="0">id was 5, should be 0 now</picture>
    <picture id="1">id was 4, should be 1 now</picture>
    <picture id="9">id was 3, should be 9 now</picture>
    <picture id="7">id was 2, should be 7 now</picture>
    <picture id="2">id was 1, should be 2 now</picture>
    <picture id="6">id was 0, should be 6 now</picture>
</pictures>

чтобы сохранить массив, вы можете использовать array_pop, чтобы получить последнее вхождение picture @ id = xy. какой должен быть разыскиваемым (см. комментарии к недостаткам)

$reorder = array(9 => "8", 8 => "5", 7 => "4", 6 => "3", 5 => "0", 4 => "1", 3 => "9", 2 => "7", 1 => "2", 0 => "6");

$objDOM = new SimpleXMLElement(
      '<pictures>...</pictures>');

foreach ($reorder as $old => $new) {
   $picture = $objDOM->xpath('picture[@id="' . $old . '"]');
   $picture = array_pop($picture);
   $picture['id'] = $new;
}

echo $objDOM->asXML();
0 голосов
/ 03 ноября 2010

Судя по примеру, приведенному в вопросе, я бы просто перебрал все элементы <picture/> и изменил бы @id соответственно. Например:

foreach ($objDOM->picture as $picture)
{
    $id = (string) $picture['id'];
    $picture['id'] = $reorder[$id];
}

Предполагается, что $reorder имеет запись для каждого @id, используемого в документе. В противном случае вам нужно будет использовать isset(), чтобы пропустить узлы, которые не нужно менять.

...