Программирование > PHP
Сортировка после preg_match_all
Moe:
Здравствуйте. Есть массив с тегами в виде ссылок. Часть тегов имеет несколько типов повторяющихся элементов (Например, тег: "Сюжет — ГМПИ"). Я хочу на основе этих повторений раскидать теги по группам под соответствующие заголовки.
Вот так:
Сюжеты
Тег2, Тег4, Тег5...
Источники
Тег1, Тег3, Тег6...
foreach ($tags as $tagkey => $onetag) {
preg_match_all ("/(<a.+[^>]>Источник.+<\\/a>$)|(<a.+[^>]>Сюжет.+<\\/a>$)|(<a.+[^>]>Текст.+<\\/a>$)/", $onetag, $matches, PREG_PATTERN_ORDER);
$done = preg_replace(\'"(Сюжет\\s—\\s)|(Текст\\s—\\s)|(Источник\\s—\\s)"\', \'\', $matches[1][0] .$matches[2][0] .$matches[3][0] ."\\n");
echo ($done);
}
Вызывая попеременно $matches, у меня получается эти группы выводить, но как приделать к ним заголовок так, чтобы не обходить массив по несколько раз для каждой группы — я не знаю. К тому же, скорее всего этих групп будет около 10. Подскажите, пожалуйста, разумное решение.
brainkiller:
Живой пример массива $tags — в студию!
Moe:
brainkiller
Речь идет о движке Wordpress и функции wp_tag_cloud. Перед этим кодом есть строка:
$tags = wp_tag_cloud(\'format=array&number=0&order=DESC&orderby=count\');
И данные там такого типа:
...
<a href=\'#\' class=\'tag-link-78\' title=\'41 тема\' rel="tag" style=\'font-size: 14pt;\'>Сюжет — Тег1</a>
<a href=\'#\' class=\'tag-link-147\' title=\'38 тем\' rel="tag" style=\'font-size: 13pt\'>Источник — Тег2</a>
<a href=\'#\' class=\'tag-link-94\' title=\'36 тем\' rel="tag" style=\'font-size: 13pt;\'>Сюжет — Тег3</a>
<a href=\'#\' class=\'tag-link-87\' title=\'31 тема\' rel="tag" style=\'font-size: 12pt;\'>Источник — Тег4</a>
...
brainkiller:
А не проще ли взять функцию wp_tag_cloud(), посмотреть, что там внутри и написать свою wp_custom_tag_cloud(), которая выдаст нужные данные в нужном формате — вместо того, чтобы парсить вывод существующей функции?
Moe:
brainkiller
Я совсем не спец, но мне кажется, что даже создавая свою функцию мне все равно придется тем или иным способом сортировать точно такой же массив тегов. Ну или просто сортировать теги по наличию в них определенных элементов тем же preg_match_all. Или я ошибаюсь?
Ну а с текущим вариантом совсем тухло? Он умеет почти все, кроме как приставлять заголовки к группам тегов, а не к каждому тегу :)
Сейчас, если я напишу:
echo ("Сюжет ".$matches[1][0);
echo ("Текст ".$matches[2][0);
То ожидаемо получу: Сюжет Тег1 Сюжет Тег2 Сюжет Тег3 Текст Тег4 Текст Тег 5 Текст Тег6.
И вопрос в том, как эту проблему разрешить, не инициализируя для каждого шаблона обход всего массива? Вроде такого:
echo ("Сюжет");
foreach ($tags as $tagkey => $onetag) {
preg_match_all ("/(<a.+[^>]>Сюжет.+</a>$)", $onetag, $matches, PREG_PATTERN_ORDER);
$done = preg_replace(\'"(Сюжетs—s)"\', \'\', $matches[0][0]."\\n");
echo ($done);
}
echo ("Текст");
foreach ($tags as $tagkey => $onetag) {
...
Навигация
Перейти к полной версии