sveden-parser/app/library/ContingentParser.php

81 lines
2.4 KiB
PHP

<?php
namespace App\Library;
use App\Library\ContingentRow;
class ContingentParser
{
private \DOMXPath $xpath;
private string $template;
private const FIELDS = [
"eduCode" => "td",
"eduName" => "td",
"eduLevel" => "td",
"eduForm" => "td",
// "numberBF" => "th",
// "numberBFF" => "th",
// "numberBR" => "th",
// "numberBRF" => "th",
// "numberBM" => "th",
// "numberBMF" => "th",
// "numberP" => "th",
// "numberPF" => "th",
"numberAll" => ["th", "td"]
];
public function __construct(string $html, string $template)
{
libxml_use_internal_errors(true);
$dom = new \DOMDocument();
$dom->loadHTML(mb_convert_encoding($html,'HTML-ENTITIES','UTF-8'));
$this->xpath = new \DOMXPath($dom);
$this->template = $template;
}
private function parse(): array
{
$data = array();
foreach (self::FIELDS as $field => $tag) {
if (!is_array($tag)) {
$data[$field] = $this->xpath->query($this->template . $tag . "[@itemprop=\"$field\"]");
} else {
$th = $this->xpath->query($this->template . $tag[0] . "[@itemprop=\"$field\"]");
$td = $this->xpath->query($this->template . $tag[1] . "[@itemprop=\"$field\"]");
$data[$field] = $th->length > $td->length ? $th : $td;
}
}
return $data;
}
public function getDataTable() : array
{
$data = $this->parse();
$records = array();
// var_dump($data['eduName']->item(0));
// exit(0);
$equel = $data['eduName']->length;
foreach ($data as $field) {
if ($field->length == 0) {
return [];
}
if ($field->length != $equel) {
return [];
}
}
for ($i = 0; $i < $data['eduCode']->length; $i++) {
$contingentRow = new ContingentRow(
$data['eduCode']->item($i)->textContent,
$data['eduName']->item($i)->textContent,
$data['eduLevel']->item($i)->textContent,
$data['eduForm']->item($i)->textContent,
(int)$data['numberAll']->item($i)->textContent
);
$records[] = $contingentRow->getData();
}
return $records;
}
}