Преминете през елементите и ги анализирайте с DOMDocument() в PHP

Имам списък с артикули като този:

<div class="list">
    <div class="ui_checkbox type hidden" data-categories="57 48 ">
        <input id="attraction_type_119" type="checkbox" value="119"
        <label for="attraction_type_119">Aquariums</label>
    </div>
    <div class="ui_checkbox type " data-categories="47 ">
        <input id="attraction_type_120" type="checkbox" value="120"
        <label for="attraction_type_120">Arènes et stades</label>
    </div>
</div>

Как мога да ги прегледам с DOMDocument, за да получа подробности като:

  • категории данни
  • входна стойност
  • текст на етикета

Ето какво опитах:

$dom = new DOMDocument();
$dom->loadHTML($html);
$xp = new DOMXpath($dom);
$elements = $dom->getElementsByTagName('div');
$data = array();
foreach($elements as $node){
    foreach($node->childNodes as $child) {
        $data['data_categorie'] = $child->item(0)->getAttribute('data_categories');
        $data['input_value'] = $child->item(0)->getAttribute('input_value');
        $data['label_text'] = $child->item(0)->getAttribute('label_text');
    }
}

Но не става.

Какво пропускам тук, моля?

Благодаря.


person popol    schedule 07.06.2020    source източник


Отговори (2)


Задаването на множество стойности в цикъла по този начин $data['data_categorie'] = с помощта на един и същ ключ за масива $data = array(); ще презапише стойностите при всяка итерация.

Тъй като имате множество елементи, можете да създадете временен масив $temp = []; за съхраняване на стойностите и да добавите масива към масива $data след съхраняване на всички стойности за текущата итерация.

Тъй като вече използвате DOMXpath, можете да получите div с < em>class="list" с помощта на израз като //div[@class="list"]/div и завъртете в цикъл childNodes, проверявайки за nodeName input и вземете тази стойност плюс стойността на следващия брат, която е стойността на етикет

$data = array();
$xp = new DOMXpath($dom);
$items = $xp->query('//div[@class="list"]/div');
foreach($items as $item) {
    $temp["data_categorie"] = $item->getAttribute("data-categories");
    foreach ($item->childNodes as $child) {
        if ($child->nodeName === "input") {
            $temp["input_value"] = $child->getAttribute("value");
            $temp["label_text"] = $child->nextSibling->nodeValue;
        }
    }
    $data[] = $temp;
}

print_r($data);

Изход

Array
(
    [0] => Array
        (
            [data_categorie] => 57 48 
            [input_value] => 119
            [label_text] => Aquariums

        )

    [1] => Array
        (
            [data_categorie] => 47 
            [input_value] => 120
            [label_text] => Arènes et stades

        )

)

Php демо

person The fourth bird    schedule 07.06.2020

Използвах string() и evaluate, за да получа резултат в една заявка:

$dom = new DOMDocument();
$dom->loadHTML($html);
$xpath = new DOMXpath($dom);
$elements = $xpath->query('//div[contains(@class, "ui_checkbox")]');
foreach($elements as $node) {
    $data = array();
    $data['data_categorie'] = $xpath->evaluate('string(./@data-categories)', $node);
    $data['input_value'] = $xpath->evaluate('string(./input/@value)', $node);
    $data['label_text'] = $xpath->evaluate('string(./label/text())', $node);
}
person gangabass    schedule 07.06.2020