Получить цены с другого сайта и присвоить переменным. Как сократить код?

Всё конечно работает, но чувствую, что здесь много лишнего кода. Мне кажется foreach здесь лишний.

Подскажите пожалуйста, скорее всего здесь можно обойтись без кучи циклов? Нужен не просто вывод цен, это было бы проще, в дальнейшем переменные с ценами будут использоваться в расчетах.

function get_web_page( $url )
    {
      $uagent = "Opera/9.80 (Windows NT 6.1; WOW64) Presto/2.12.388 Version/12.14";
    
      $ch = curl_init( $url );
    
      curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);   // возвращает веб-страницу
      curl_setopt($ch, CURLOPT_HEADER, 0);           // не возвращает заголовки
      curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);   // переходит по редиректам
      curl_setopt($ch, CURLOPT_ENCODING, "");        // обрабатывает все кодировки
      curl_setopt($ch, CURLOPT_USERAGENT, $uagent);  // useragent
      curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 120); // таймаут соединения
      curl_setopt($ch, CURLOPT_TIMEOUT, 120);        // таймаут ответа
      curl_setopt($ch, CURLOPT_MAXREDIRS, 10);       // останавливаться после 10-ого редиректа (не много ли!?)
    
      $content = curl_exec( $ch );
      $err     = curl_errno( $ch );
      $errmsg  = curl_error( $ch );
      $header  = curl_getinfo( $ch );
      curl_close( $ch );
    
      $header['errno']   = $err;
      $header['errmsg']  = $errmsg;
      $header['content'] = $content;
      return $header;
    }
    
    $url = 'https://металлград.com/catalog/truba-profilnaya/';
    $data = get_web_page($url); // загружаем результат с помощью нашей функции
    
    
    $dom = new DomDocument();
    libxml_use_internal_errors(true);
    $dom->loadHTML( $data['content'] );
    libxml_use_internal_errors(false);
    $xpath = new DomXPath( $dom );
    
    $_20_20_15 = $xpath->query(".//*[@id='content']/div/div/div[2]/div[1]/div[1]/table/tbody/tr[3]/td[3]");
     $_20_20_2 = $xpath->query(".//*[@id='content']/div/div/div[2]/div[1]/div[1]/table/tbody/tr[4]/td[3]");
    $_25_25_15 = $xpath->query(".//*[@id='content']/div/div/div[2]/div[1]/div[1]/table/tbody/tr[5]/td[3]");
    
    foreach( $_20_20_15 as $obj ) {$_20_20_15 = $obj->nodeValue;}
    foreach( $_20_20_2 as $obj ) {$_20_20_2 = $obj->nodeValue;}
    foreach( $_25_25_15 as $obj ) {$_25_25_15 = $obj->nodeValue;}
    
    echo '20*20*1.5 - '.$_20_20_15.'<br/>';
    echo '20*20*2 - '.$_20_20_2.'<br/>';
    echo '25*25*1,5 - '.$_25_25_15.'<br/>';

Ответы (1 шт):

Автор решения: Jean-Claude

Я предпочитаю регулярки для парсинга хтмл, с помощью DomDocument() тоже можно перебирать циклом, а не вручную набирать цену каждого товара.

function get_web_page($url) {
    $uagent = "Opera/9.80 (Windows NT 6.1; WOW64) Presto/2.12.388 Version/12.14";

    $ch = curl_init($url);

    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);   // возвращает веб-страницу
    curl_setopt($ch, CURLOPT_HEADER, 0);           // не возвращает заголовки
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);   // переходит по редиректам
    curl_setopt($ch, CURLOPT_ENCODING, "");        // обрабатывает все кодировки
    curl_setopt($ch, CURLOPT_USERAGENT, $uagent);  // useragent
    curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 120); // таймаут соединения
    curl_setopt($ch, CURLOPT_TIMEOUT, 120);        // таймаут ответа
    curl_setopt($ch, CURLOPT_MAXREDIRS, 10);       // останавливаться после 10-ого редиректа (не много ли!?)
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);       // останавливаться после 10-ого редиректа (не много ли!?)

    $content = curl_exec($ch);
    $err = curl_errno($ch);
    $errmsg = curl_error($ch);
    $header = curl_getinfo($ch);
    curl_close($ch);

    $header['errno'] = $err;
    $header['errmsg'] = $errmsg;
    $header['content'] = $content;
    return $header;
}


$url = 'https://металлград.com/catalog/truba-profilnaya/';
$html = get_web_page($url)['content']; // загружаем результат с помощью нашей функции

//3 кармана
preg_match_all('~<tr data-id="[^"]+">\s*<td>(.+?)</td>\s*<td>(.+?)</td>\s*<td>(.+?)</td>~isu', $html, $finded);

$table = [];
foreach ($finded[1] as $k => $v) {
    $table[$k] = array_merge([strip_tags($v)], [$finded[2][$k]], [is_numeric($finded[3][$k]) ? $finded[3][$k] : '-']);
}

var_dump($table);

//array (size=55)
//  0 => 
//    array (size=3)
//      0 => string 'Труба Профильная  10 Х 10 Х 1,2 Х.к.' (length=55)
//      1 => string '6.00' (length=4)
//      2 => string 'ожидаем' (length=14)
//  1 => 
//    array (size=3)
//      0 => string 'Труба Профильная  15 Х 15 Х 1,5' (length=48)
//      1 => string '6.00' (length=4)
//      2 => string '57' (length=2)
//  2 => 
//    array (size=3)
//      0 => string 'Труба Профильная  20 Х 20 Х 1,5' (length=48)
//      1 => string '6.00' (length=4)
//      2 => string '78' (length=2)
→ Ссылка