Упорядочить вывод данных, в зависимости от самих данных

BeatBox

Guest
Упорядочить вывод данных, в зависимости от самих данных

Здравствуйте. У меня есть такой вопросик:

есть раздел на сайте, и при добавлении в него материала (статьи) автор выбирает к каким категориям он относиться (категорий может быть несколько, они записываються через ТИРЕ в базу данных (тоесть их айдишники) а сами названия категорий в другой таблице).
При выводе материала, чтобы показать к какой категории (категориям) он относиться я использую такой код (он рабочий, тут все окей вроде как):
PHP:
 $style = $row['style']; //это беруться айдишники категорий из таблицы стаьи, например 1-5-29
$asso_tx = explode("-",$style);
        for ($x=0; $x<count($asso_tx); $x++) {
        if ($asso_tx[$x] != "") {

          $thistopicx = $mytopicsx[$asso_tx[$x]]; обращение к массиву, который до этого (выше) считал все категории. Масив я не привожу покачто, так как ту вопросов нет

            $janr .= "$thistopicx / "; // вывожу категории, например кулинария / пиротехника / румба =) 
            }
}
Что мне нужно - каким-то образом упорядочивать вывод категорий.. ну вот например:
Есть категории (так как сайт про игры, то буду писатьк как есть)
Action, Tactical и Shhoter.
Нужно чтобы если статья относиться к категориям Action и Tactical, то выводилось не "Action / Tactical" a "Action (Tactical)".
Есть все три категории, то чтобы вывод был - "Action (Tactical / Shooter)".
А если просто выбрано 'Tactical', то чтобы вывело "Action (Tactical)" - тоесть получаеться есть как бы главные категории, и от них зависящие.

Сами категории храняться в таблице вида
ID | Name
Как думаете, такое возможно в моем случае? или прийдеться что-то переписывать и даже использовать javascript?
 

Sluggard

Новичок
Ты уверен, что индекс в массиве категорий совпадает с id??

Я бы сделал так: Названия категорий статьи занасил бы во временный массив, потом его сортировал [m]sort[/m] и объеденял в строку [m]implode[/m]
 

BeatBox

Guest
ух.. а ничего более простого и доходчивого нет? :)
 

Buteo

[CDR/DVP]
BeatBox
пока не поздно, сделай как тебе советовали через три таблицы связь статья/категории... послушай умных людей...

да, и в таблицы категории сделай поле parent, для указания родителя...
 

BeatBox

Guest
Ты уверен, что индекс в массиве категорий совпадает с id??
на все 100%

-~{}~ 12.03.05 19:50:

Buteo
я через три таблицы связь вообще непонял :( Что куда откуда - непонимаю :( Мне впринципе эти категории нужны только что бы потом их подсатвить в select like "%$game_type%"... тоесть для сортировки по жанрам игр.
 

Buteo

[CDR/DVP]
BeatBox
если не понял, то чего молчишь?
объясняю на пальцах :)

artiсles {id,text}
categories {id,parent,name}
article2category {aid,cid}

Есть статья с id=4 и категориии Tactical (id=6), Action (id=2), Shooter (id=12)

если статья и "тактика" и "шутр", а эти жанры - поджанры Экшен, то у тебя получаеться такие данные в таблицах
статьи {4, "какой то текст"}
категории
{2,0,Action}
{6,2,Tactical}
{12,2,Shooter}
article2category
{4,6}
{4,12}

PHP:
SELECT a.name FROM article2category ac,  artiсles a, categories c
WHERE c.id = ac.cid AND a.id = ac.aid
ORDER by c.name
например выбрать только статьи по шутырам
PHP:
SELECT a.name FROM article2category ac, artiсles a 
WHERE a.id = ac.aid AND ac.cid = 12
 

BeatBox

Guest
Buteo
спасибо ;) Но я честно говоря ещё больше запутался.. я не представляю теперь как мне вообще статью добавлять :( и что куда заносить.. вот у меня такой код используеться во время добавления статьи:

PHP:
 echo "<table border='0' width='100%' cellspacing='0'><tr><td width='20%'><b>Жанры</b></td><td width='100%'>"
        ."<table border='0' cellspacing='3' cellpadding='8'><tr>";
    $sql = "SELECT topicid, topicname FROM ".$prefix."_game_types ORDER BY topicname";
    $result = $db->sql_query($sql);
    while ($row = $db->sql_fetchrow($result)) {
        if ($a == 3) {
            echo "</tr><tr>";
            $a = 0;
        }
        echo "<td><input type='checkbox' name='style[]' value='$row[topicid]'>$row[topicname]</td>";
        $a++;
    }
    echo "</tr></table></td></tr></table><br><br>";
тоесть выбираються названия из жанов игр, и когда я жму "написать статью" то в поле style таблицы статей записываються айдишники выбранных категорий через тире.

А как сделать через три таблицы?

-~{}~ 12.03.05 20:18:

Buteo
спасибо ;) Но я честно говоря ещё больше запутался.. я не представляю теперь как мне вообще статью добавлять :( и что куда заносить.. вот у меня такой код используеться во время добавления статьи:

PHP:
 echo "<table border='0' width='100%' cellspacing='0'><tr><td width='20%'><b>Жанры</b></td><td width='100%'>"
        ."<table border='0' cellspacing='3' cellpadding='8'><tr>";
    $sql = "SELECT topicid, topicname FROM ".$prefix."_game_types ORDER BY topicname";
    $result = $db->sql_query($sql);
    while ($row = $db->sql_fetchrow($result)) {
        if ($a == 3) {
            echo "</tr><tr>";
            $a = 0;
        }
        echo "<td><input type='checkbox' name='style[]' value='$row[topicid]'>$row[topicname]</td>";
        $a++;
    }
    echo "</tr></table></td></tr></table><br><br>";
тоесть выбираються названия из жанов игр, и когда я жму "написать статью" то в поле style таблицы статей записываються айдишники выбранных категорий через тире.

А как сделать через три таблицы?
 

Buteo

[CDR/DVP]
да, если у категории парент не 0 то это "подкатегория"... а значит и выводишь по-другому и т.п...

-~{}~ 12.03.05 20:27:

BeatBox
я код смотреть не буду... пример дал, в инете на эту тему думаю масса информации...

чтобы занести категории статьи, надо занести дополнительно еще две (три, четыре.... ) строки id_статьи| id_катерии в article2category

и самое главное... почитать чтото :)
 

BeatBox

Guest
оЁ ну получаеться тогда что можно и через две таблицы просто с парентом сделать, да? :)
Ещё вопросик - как делать так, чтобы при перечеслении значений, например тех же категорий, - они разделялись чем-то (тире, слеш, бекслеш - неважно). Тоесть сделать правильно.. например если это только одно значение, то пусть пишеться как есть, а если их 2, 3 4 и т.п. - пусть их разделяют?
прсто пока что я пользуюсь банальным добавлением знака в конец значения. получаеться что у последнего значения (то же категории) тоже в конце стоит разделитель (хотя разделять0то по сути с пустотой ненужно :) )

-~{}~ 12.03.05 20:38:

Кстате я на всякий случай ещё немного поясню - тут упор идет не на то что это категории. а на то чтобы их выводить правильно. Тоесть все-таки три таблицы это излишне - эти данные используються лишь для классификации. У одной игры бывает несколько жанров, так что заостряться на конкретном выводе как-то категории (потом) ненужно - только 'like '%xxx%'. ) Ох наверное так сказал что ничего непонятно :)
 

Sluggard

Новичок
А можно увидеть код? :) Ты делаешь пустой элемент массива?

Куда проще? Замени код, который привел вот этим и будет тебе счастие :)
PHP:
$style = $row['style'];
$asso_tx = explode('-',$style);
$temp = array();
for ($x = 0; $x < count($asso_tx); $x++)
  if ($asso_tx[$x] != '') $temp[] = $mytopicsx[intval($asso_tx[$x])]; //использовал intval
sort($temp);
$janr .= implode(' / ', $temp);
 

Buteo

[CDR/DVP]
да не... всё ясно...
дело в другом: ты не хочешь слушать то что тебе говорят, так что делай как знаешь...
 

BeatBox

Guest
Buteo
Это не так :( Просто я невьезжаю абсолютно в то как сделать через три таблицы, и поэтому стараюсь настроить то что уже работает. Честное слово - не хотел бы слушать - даже бы и не появился бы на форуме :)

Sluggard
За код спасибо (правда ещё не проверил - занят пока этими парентами :) )
код:
PHP:
$mytopics = array();
        $res = $db->sql_query("SELECT topicid, topicname FROM ".$prefix."_game_types");
        while(list($topicid, $topictext)=$db->sql_fetchrow($res)){
        $a = array ($topicid=>$topictext);
        $mytopics = $mytopics+$a;
        }
 

Sluggard

Новичок
Тоесть все-таки три таблицы это излишне
Три таблицы - так делают нормальные люди. А если тебе нравится усложнять себе жизнь, то можно было обойтись и одной. ;)
 

BeatBox

Guest
Уважаемые, а Вы немогли бы мне подсказать:
вот я занес в таблицу категорий
айди / Имя / парент (тоесть айди категории в этой же таблице которая являеться основной для этой категории)
Как теперь сделать вывод, мол если
$parent !== "0" TO рисуем "Имя родителя (название категории)"
(кстате ссылки никакине нигде ненужны, в этом и удобство - нужно только отображать жанр(ы) игры)

-~{}~ 12.03.05 20:59:

Просто я понимаю что нормальные категории нужно делать из 3ех таблиц, но я просто плохо обьяснил - ведь получаеться у меня это не категории а просто жанры игр, которые как категории отдельно нигде не выводяться, а только на странице игры в графе "жанры".
 

Sluggard

Новичок
В упрощенном виде
Таблица categories
-------------------------
id - идентификатор
title - заголовок

Таблица articles
-------------------------
id - идентификатор
text - текст статьи

Таблица links
-------------------------
id - идентификатор
cid - id категории
aid - id статьи
 

BeatBox

Guest
хех блин никак немогу сделать чтобы если $parent !== "0" то..
может я что не так делаю?
Посмотрите пожалуйста код:
массив:
PHP:
$mytopics = array();
        $res = $db->sql_query("SELECT topicid, topicname, parent FROM ".$prefix."_game_types");
        while(list($topicid, $topictext, $parent)=$db->sql_fetchrow($res)){
        $a = array ($topicid=>$topictext);
        $mytopics = $mytopics+$a;
        }
и потом показываю категории:
PHP:
$asso_t = explode("-",$style);
        for ($i=0; $i<count($asso_t); $i++) {
        if ($asso_t[$i] != "") {

          $thistopic = $mytopics[$asso_t[$i]];
          if ($parent !== "0") {
            $janr .= "(<a class=s2
            href=\"page.php?name=games&pa=filter&v=$asso_t[$i]\"><u>
            ".$thistopic."</u></a>) "; }
            
            elseif ($parent == "0") {$janr .= "1<a class=s2
            href=\"page.php?name=games&pa=filter&v=$asso_t[$i]\"><u>
            ".$thistopic."</u></a>"; }
            }

        }
ничего невыходит :-\

-~{}~ 12.03.05 22:55:

Помогите пожалуйста

-~{}~ 13.03.05 03:48:

Подскажите пожалуйста, как в коде (выше) сделать чтобы работало условие,
если $parent не ноль, то ....?
 

BeatBox

Guest
Sluggard
угу тоже смотрю - сделал.. а на практике - ноль :(

-~{}~ 14.03.05 17:09:

Никто незнает как сделать правильно? ;)
 

Sluggard

Новичок
У тебя $parent постоянно переопределяется в цикле, но не сохраняется в массиве. А за циклом проверяется последний!!!

PHP:
for ($i = 0; $i < 10; $i++)
  $a = $i;
if ($a == 1) print 'ok';
Почему у меня никогда не выводит "ok"???
 
Сверху