@timers

Как брать только первую цифру ID категории?

Делаю карту сайта, столкнулся с проблемой, сам код:
function get_modul1($table, $xml)
    {
        global $db;
        $lastmod = date("Y-m-d");

        $cats = $db->super_query('select id, options from ' . PREFIX . '_' . $table . '_options where type="category"', true);
        $posts = $db->super_query('select alt_name, category from ' . PREFIX . '_' . $table . '_post where approve="1"', true);
        $postsCat = [];

        foreach ($posts as $post) {
            $postsCat[$post['category']][] = $post['alt_name'];
        }
        unset($posts);


        $table .= '/';

        $loc = $this->home . $table;
        $xml .= $this->get_xml($loc, $lastmod);
        foreach ($cats as $cat) {
            $cat_alt = explode('|||alt_name=', $cat['options'])[1];
            $cat_alt = explode('|||', $cat_alt)[0];

            $loc = $this->home . $table . $cat_alt . '/';
            $xml .= $this->get_xml($loc, $lastmod);
            foreach ($postsCat[$cat['id']] as $post) {
                $loc = $this->home . $table . $cat_alt . '/' . $post . '/';
		
                $xml .= $this->get_xml($loc, $lastmod);
            }
        }
        return $xml;
    }


Делаю карту сайта, все категории выводятся нормально, а вот с постами проблема, посты добавлены в несколько категорий: 12,23,34,35,55 и тд. Когда код хочет сформировать урл возникает трабл, т.к. он ищет именно категорию например 12, а когда делает запрос в посте 12,23,34,35,55 и тд. и таким образом он не может определить в какой категории пост.

Мне нужно чтобы урл формировался по первой категории, а остальные категории что идут после запятой не принимались во внимание.
  • Вопрос задан
  • 74 просмотра
Решения вопроса 1
@timers Автор вопроса
foreach ($posts as $post) {
        $postFirstCat = explode(',', $post['category'])[0];
	$postsCat[$postFirstCat][] = $post['alt_name'];
}
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
ThunderCat
@ThunderCat Куратор тега PHP
{PHP, MySql, HTML, JS, CSS} developer
Насколько я понял, вы храните список категорий в одном поле через запятую. Это изначально неверный подход, противоречащий 3 нормальной форме, кроме того больше приносящий вреда и гемора чем профита. Кажущаяся "простота" такого подхода (как видно из вашего примера) оборачивается проблемами как только нужно применить логику чуть сложнее "выбрал-показал". Скорее всего при такой структуре самым "хорошим" решением будут циклы с запросами, что само по себе уже кошмарный говнокод.

Как вариант решения конкретно этой задачи - можно так:

foreach ($posts as $post) {
    $postsCat[trim(explode(',', $post['category'])[0])][] = $post['alt_name'];
}
unset($posts);
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы