Вот мой код:
$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 и заставить его работать?
Заранее спасибо!
В настоящее время документация на 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. Если это так, следует использовать методы для предотвращения злоупотребления, иначе ожидайте исключения или фатальные ошибки.
Вы можете попробовать с помощью текущих и следующих функций массива (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);
}
$i=0;
foreach ($n as $entry) {
$Name = $entry->nodeValue;
$RAM = $r[$i]->nodeValue;
echo " $Name - RAM: $RAM<br>";
$i++;
}
использовать переменную $ key внутри цикла
foreach ($n as $key => $entry) {
$Name = $entry->nodeValue;
$RAM = $r[$key]->nodeValue;
echo " $Name - RAM: $RAM<br>";
}
foreach ($n as $key => $entry) { $Name = $entry->nodeValue; $RAM = $r[$key]->nodeValue; echo " $Name - RAM: $RAM<br>"; }