Как я могу сделать этот синтаксический анализатор PHP DOM более эффективным с вложенными массивами?

Как я могу сделать этот парсер более эффективным? Я чувствую себя так, будто заявления сумасшедшие! Я думаю, что функция обратного вызова сможет выполнить работу.
Тем не менее, большинство моих идентификаторов сильно отличаются, и мне нужно пройти через много разных ключей. Должен ли я создать массив тегов и массив элементов DOM и создать функцию обратного вызова для каждого из них, чтобы удалить нулевые значения? Я пытаюсь собрать скребок в первый раз, и я действительно озадачен логикой здесь.

Любая помощь будет принята с благодарностью!

foreach($html->find('.b-card') as $article) {
$data[$y]['business']     = $article->find('h1', 0)->plaintext;
$data[$y]['address']      = $article->find('.address', 0)->plaintext;

if($article->find('.phone-num', 0)) {
$data[$y]['phone']      = $article->find('.phone-num', 0)->plaintext;
} else {
$data[$y]['phone']     = 'Number not listed.';
}

if($article->find('.link', 0)) {
$data[$y]['website']    = $article->find('.link', 0)->plaintext;
} else {
$data[$y]['website']   = 'Website not listed.';
}
if($article->find('.established', 0)) {
$data[$y]['years']    = str_replace("\r\n","",$article->find('.established', 0)->plaintext);
} else {
$data[$y]['years']   = 'Years established not listed.';
}
if($article->find('.open-hours', 0)) {
$data[$y]['hours']    = $article->find('.open-hours', 0)->plaintext;
} else {
$data[$y]['hours']   = 'Hours not listed.';
}
if($article->find('.categories a', 0)) {
$data[$y]['category']    = $article->find('.categories a', 0)->plaintext;
} else {
$data[$y]['category']   = 'Category not listed.';
}

$articles[] = $data[$y];
}

}

Я чувствую, что могу сделать что-то подобное

function my_callback($element) {
// remove all null tags
if ($element->tag)
$article->find....;
}

0

Решение

Используйте массив, который собирает всю связанную информацию в каждом if блок.

$selector_list = array(
array('selector' => '.phone-num', 'index' => 'phone', 'name' => 'Number'),
array('selector' => '.link', 'index'' => 'website', 'name' => 'Website'),
array('selector' => 'open-hours', 'index' => 'hours', 'name' => 'Hours'),
array('selector' => '.categories a', 'index' => 'category', 'name' => 'Category')
);

Тогда вы можете использовать простой foreach цикл со всем общим кодом:

foreach ($selector_list as $sel) {
$found = $article->find($sel['selector'], 0);
if ($found) {
$data[$y][$sel['index']] = $found;
} else {
$data[$y][$sel['index']] = $sel['name'] . " not listed.";
}
}
// Special case for selector that doesn't follow the same pattern
$found = $article->find('.established', 0);
if ($found) {
$data[$y]['years'] = str_replace("\r\n", "", $found);
} else {
$data[$y]['years'] = Years established not listed.';
}

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

0

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

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

По вопросам рекламы [email protected]