PHP HTML строка в массив с DOMDocument, не возвращая каждый элемент

Я пытаюсь создать функцию, которая преобразует строку HTMl в многомерный массив, где родительский массив является тегом, а дочерние элементы являются атрибутами, но если я print_r() моя функция это не возвращает каждый элемент.

Строка изначально является частью большого объекта и выглядит следующим образом:

Array
(
[0] => stdClass Object
(
[html] =>
<input type="radio" name="radio1" value="18" checked="checked" id="80">
<label class="other" for="80">Label for radio 1</label>
<input type="radio" name="radio2" value="20" id="81">
<label class="other" for="81">Label for radio 2</label>
)

[1] => stdClass Object
(
[html] =>
<input type="radio" name="radio3" value="19" checked="checked" id="91">
<label class="other" for="91">Label for radio 3</label>
<input type="radio" name="radio4" value="21" id="92">
<label class="other" for="92">Label for radio 4</label>
)

)

и это моя функция:

<?php
function htmltoarray($param){
$doc = new DOMDocument();
$doc->loadHTML($param);
$doc->preserveWhiteSpace = false;
$html = $doc->getElementsByTagName('*');
$form = array();
foreach($html as $v){
$tag = $v->nodeName;
$val = $v->nodeValue;
foreach($v->attributes as $k => $a){
$form[$tag]['txt'] = utf8_decode($val);
$form[$tag][$k] = $a->nodeValue;
}
}
return $form;
}

// AND I CALL THE FUNCTION HERE:
foreach($myobject as $formelement){
$convertthis = $formelement->html;
echo '<pre>'; print_r(htmltoarray($convertthis)); echo '</pre>';
}
?>

и это возвращает это:

<pre>Array
(
[input] => Array
(
[txt] =>
[id] => 80
[checked] => checked
[type] => radio
[value] => 20
[name] => radio1
)

[label] => Array
(
[txt] => Label for radio 1
[for] => 80
[class] => other
)

)
</pre>

<pre>Array
(
[input] => Array
(
[txt] =>
[id] => 92
[checked] => checked
[type] => radio
[value] => 21
[name] => radio4
)

[label] => Array
(
[txt] => Label for radio 4
[for] => 92
[class] => other
)

)
</pre>

Как видите, он возвращает первые два элемента из первой строки и последние два из второй строки.

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

1

Решение

Значения внутри вашего массива перезаписываются, получая только последнее значение. Сначала создайте временный массив группировки. Затем объедините их и вставьте внутрь.

Я немного улучшил это:

function htmltoarray($param){
$doc = new DOMDocument();
$doc->loadHTML($param);
$doc->preserveWhiteSpace = false;
// get body children
$html = $doc->getElementsByTagName('body')->item(0)->childNodes;
$form = array();
foreach($html as $v){
if(get_class($v) != 'DOMText') { // disregard Text nodes
$tag = $v->nodeName;
$val = $v->nodeValue;
$attrs = array();
foreach($v->attributes as $k => $a){ // gather all attributes
$attrs[$k] = $a->nodeValue;
}
// merge dom text value with attributes
$element = array_merge(array('txt' => utf8_decode($val)), $attrs);
$form[$tag][] = $element; // push them inside with another dimension
// ^ this one
}
}

return $form;
}

// AND I CALL THE FUNCTION HERE:
foreach($myobject as $formelement){
$convertthis = $formelement->html;
echo '<pre>'; print_r(htmltoarray($convertthis)); echo '</pre>';
}

Пример вывода

0

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector