PHP - Как объединить массивы foreach в один цикл

1

Вот мой код:

$url = "https://www.leaseweb.com/dedicated-servers/single-processor";

libxml_use_internal_errors(true); 
$doc = new DOMDocument();
$doc->loadHTMLFile($url);

$xpath = new DOMXpath($doc);

$n = $xpath->query('//td[@data-column-name="Model"]');
$r = $xpath->query('//td[@data-column-name="RAM"]');

foreach ($n as $entry) {
    $Name = $entry->nodeValue;
    $RAM  = $r->nodeValue;
    echo " $Name - RAM: $RAM<br>";
}

Я успешно echo $Name но я не могу получить значение для $RAM потому что у меня его нет в моем массиве. Мой вопрос в том, как я могу добавить $r в этот цикл foreach и заставить его работать?

Заранее спасибо!

  • 0
    foreach ($n as $key => $entry) { $Name = $entry->nodeValue; $RAM = $r[$key]->nodeValue; echo " $Name - RAM: $RAM<br>"; }
  • 0
    Я не понимаю Вы можете сделать это как ответ?
Показать ещё 6 комментариев
Теги:
arrays

4 ответа

1
Лучший ответ

В настоящее время документация на PHP неоднозначна. DOMXPath::query возвращает DOMNodeList который на самом деле не является Iterator и, похоже, не реализует ArrayAccess а скорее реализует Traversable которого нет определенной сигнатуры, которая помогает перемещаться по объекту.

Здесь что-то, что приходит на ум:

$item = 0;
foreach ($n as $entry) {
    $Name = $entry->nodeValue;
    $RAM  = $r->item($item)->nodeValue;
    echo " $Name - RAM: $RAM<br>";
    $item++;
}

Что-то еще, что может работать:

$iterator = new IteratorIterator($r);
$iterator->rewind();
foreach ($n as $entry) {
    $Name = $entry->nodeValue;
    $node = $iterator->current();
    $RAM  = $node->nodeValue;
    $iterator->next();
    echo " $Name - RAM: $RAM<br>";
}

Класс IteratorIterator:

Эта оболочка итератора позволяет преобразовать все, что является Traversable в Iterator. Важно понимать, что большинство классов, которые не реализуют итераторы, имеют причины, поскольку, скорее всего, они не позволяют установить полный набор функций Iterator. Если это так, следует использовать методы для предотвращения злоупотребления, иначе ожидайте исключения или фатальные ошибки.

  • 0
    Пока это единственный рабочий ответ! Спасибо вам большое!
0

Вы можете попробовать с помощью текущих и следующих функций массива (php doc)

libxml_use_internal_errors(true); 
$doc = new DOMDocument();
$doc->loadHTMLFile($url);

$xpath = new DOMXpath($doc);

$n = $xpath->query('//td[@data-column-name="Model"]');
$r = $xpath->query('//td[@data-column-name="RAM"]');
//Reset pointer to first element and assign to currR
$currR = reset($r);

foreach ($n as $entry) {
    $Name = $entry->nodeValue;
    $RAM  = $currR->nodeValue;
    echo " $Name - RAM: $RAM<br>";
    //Move pointer to next element and assign this to currR
    $currR = next($r);
}
  • 0
    Это не работает. Полный код опубликован выше в отредактированном вопросе. Теперь вы можете проверить это.
0
$i=0;
foreach ($n as $entry) {
    $Name = $entry->nodeValue;
    $RAM  = $r[$i]->nodeValue;
    echo " $Name - RAM: $RAM<br>";
    $i++;
}
  • 0
    Проверено, но не работает.
  • 0
    если вы можете опубликовать print_r ($ r), тогда я могу помочь
0

использовать переменную $ key внутри цикла

   foreach ($n as $key => $entry) {
        $Name = $entry->nodeValue;
        $RAM  = $r[$key]->nodeValue;
        echo " $Name - RAM: $RAM<br>";
    }
  • 0
    Я получаю пустой экран. Кажется, это не работает.
  • 0
    Ваш пустой экран может быть результатом ошибки. Пожалуйста, проверьте журнал ошибок

Ещё вопросы

Сообщество Overcoder
Наверх
Меню