Как объединить два цикла PHP 'foreach' - PullRequest
1 голос
/ 23 февраля 2012

Я пытаюсь разобрать действительно простой HTML-документ с некоторым xpath. Всего 20 изображений и 20 ссылок. Моя единственная цель - применить каждую ссылку к соответствующему изображению.

Мой текущий код ниже возвращает каждое изображение несколько раз . Так, например, к первому изображению, которое в настоящее время отображается 20 раз, к каждому экземпляру применяется отдельная ссылка. Таким образом, к экземпляру № 1 изображения № 1 применена ссылка № 1, к экземпляру № 2 изображения № 1 применена ссылка № 2 и т. Д.

Что я хочу сделать, так это включить каждое изображение один раз и применить к нему соответствующую ссылку, чтобы у меня было 20 изображений с соответствующими ссылками на них. Я почти уверен, что мне нужно объединить две функции foreach, но я не совсем уверен, как это сделать. Любая помощь будет отличной, спасибо, ребята.

foreach ( $images = $xpath->query("//div[@class='image']//a//img") as $image )
    {
foreach ( $links = $xpath->query("//div[@class='image']//a") as $link )
        echo "<a href='" . $link->getAttribute( 'href' ) . "'><img src='" . $image->getAttribute( 'src' ) . "'</a>", "\n";
    }

Ответы [ 2 ]

2 голосов
/ 23 февраля 2012

Расширение идеи Игнасио ...

Сначала запросите все якорные элементы, содержащие изображения

$anchors = $xpath->query('//div[@class="image"]//a[img]');

Затем используйте привязку в качестве контекста для поиска изображений

foreach ($anchors as $anchor) {
    $images = $anchor->getElementsByTagName('img');
    $img = $images->item(0);

    printf('<a href="%s"><img src="%s"></a>%s',
           $anchor->getAttribute('href'),
           $img->getAttribute('src'),
           PHP_EOL);
}

Обновление

Мне кажется, это гораздо более подходящая работа для преобразования XSL

1 голос
/ 23 февраля 2012

ОК, поэтому, если я правильно понимаю, после выполнения запросов xpath у вас получится два массива, каждый с одинаковым количеством элементов, и все они будут сопоставлены, что означает, что $ images [x] нужно $ links [x ] для любого значения х.

Примерно так может работать:

$images = $xpath->query("//div[@class='image']//a//img");
$links = $xpath->query("//div[@class='image']//a");

foreach ( $images as $index => $image )
{
  echo "<a href='" . $links[$index]->getAttribute( 'href' ) . "'><img src='" . $images[$index]->getAttribute( 'src' ) . "'</a>", "\n";
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...