@ayapergenov

Как правильно прописать функцию при выводе в ассоциативном массиве xpath запроса?

Нужно массивом передать вывод списка xpath запроса. Прописал xpath правильно и даже могу вывести отдельный результат (Пример закомментировал в коде).
Как исправить ошибку Notice: Undefined property: DOMNodeList::$nodeValue ?
<?php
$specoffer = "http://www.msk.lenta.com/show/product/92003/";
libxml_use_internal_errors(true);
$doc = new DOMDocument();
libxml_clear_errors();

$doc->loadHTMLFile($specoffer);
$doc->saveHTML();

$doc->preserveWhiteSpace = false;
$xpath = new DOMXPath($doc);

$prices_name = "Цена: ";
$discounts_name = "Цена со скидкой: ";
$goodsnames_name = "Название: ";
$imglinks_name =  "Ссылка на изображение: ";
$goodsdesriptions_name = "Описание: ";

$prices_value = $xpath->query("/html/body/div[1]/div/div/div/section/div/div/main/div[2]/div[2]/div[1]/div/span[2]");
$discounts_value = $xpath->query("/html/body/div[1]/div/div/div/section/div/div/main/div[2]/div[2]/div[1]/div/span[1]");
$goodsnames_value = $xpath->query("/html/body/div[1]/div/div/div/section/div/div/main/div[2]/div[2]/h3");
$imglinks_value =  $xpath->query("/html/body/div[1]/div/div/div/section/div/div/main/div[2]/div[1]/a/img");
$goodsdesriptions_value = $xpath->query("/html/body/div[1]/div/div/div/section/div/div/main/div[2]/div[2]/p[1]");

$arr = array(
            $prices_name => $prices_value,
            $discounts_name => $discounts_value,
            $goodsnames_name => $goodsnames_value,
            $imglinks_name => $imglinks_value,
            $goodsdesriptions_name => $goodsdesriptions_value
            );

foreach($arr as $key => $value)
  {
     echo $key . $value->nodeValue . "<br />";
  }
// Рабочий вариант
// foreach ($prices_value as $price) {
//      echo "Цена: {$price->nodeValue} <br>";
// }
  • Вопрос задан
  • 422 просмотра
Решения вопроса 2
glebovgin
@glebovgin
Full Stack Web Developer
Чтобы получить единичное значение после xpath-запроса, вам надо использовать метод item().
То есть, условно:
$prices_value = $xpath->query("//div/span[2]");
if($prices_value !== FALSE && $prices_value->length > 0)
   echo $prices_value->item(0)->nodeValue; // тут ваше значение


Без использования item() вы можете обходиться только если итерируете результаты query(), например:
$prices_value = $xpath->query('//div/span');
if($prices_value !== FALSE && $prices_value->length > 0)
{
   foreach($items as $item)
      echo $item->nodeValue;
}


И это уже немного за рамками вашего вопроса, но я бы рекомендовал сократить xpath-выражения в query(). Я понимаю, что вы их скопировали из Firebug или другой вед-дев тулзы, но в вашем случае минимальное изменение верстки донора приведет к отказу работы ваших xpath-запросов.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы