Trocha programování

Když jsem vyvíjel NORS 3, musel jsem řešit, jak napsat co nejlépe algoritmus, který vytvoří vazby mezi komentáři.

Pokud nevíte, co tím myslím, trochu to přiblížím: když někdo chce reagovat na nějaký komentář, klikne na odkaz Odpovědět, který vloží do pole Text např. [1]. Nebo to může udělat ručně.

A já jsem potřeboval napsat algoritmus, který zjistí tyto vazby mezi komentáři a přidá k nim texty: "reakce na ..." a "tento komentář inspiroval...". Samozřejmě jsem také potřeboval, aby měl tento algoritmus co možná nejmenší složitost, tedy ne nějakou O(2^N).

Chvíli popřemýšlejte, jak byste to řešili a pak schválně porovnejte s mým řešením. O(2N).

//$q3 je objekt ktery obsahuje odkaz na MySQL resource
//$q3->fetch() vraci pole jako fce mysql_fetch_array

while($kom = $q3->fetch()){
    $komentar[$i] = clear_comment($kom); //odstrani vsechny nebezpecnosti
    
    if(eregi("[([[:digit:]]+)]",$komentar[$i]['text'])){  //obsahuje komentar [x]?
      $j = eregi_replace(".*[([[:digit:]]+)].*","1",$komentar[$i]['text']); //ziskani cisla
      if($i>$j){ //pouze pokud reaguje na starsi komentare
        $reakce[$i][]=$j;
        $inspirace[$j][]=$i;
      }
    }
    $i++;
  }   
if(is_array($komentar)){
    $i = 1;
    foreach($komentar as $key=>$value){
      $kom = $value;
      $kom['text'] = eregi_replace("[([[:digit:]]+)]","",$kom['text']); //odstraneni [x]
      echo '<div class="komentar" id="post'.$kom['id_komentar'].'">';
      echo '<div class="autor">';
      echo '[<a href="'.GenUrl(array('show'=>'clanek','id'=>$line['link'])).'#post'.$komentar[$i]['id_komentar'].'" title="permanent link">'.$i.'</a>]';
      
      if($kom['web']) echo ' <a href="'.$kom['web'].'"> '.stripslashes($kom['user']).'</a>';
      elseif($kom['mail']) echo ' <a href="mailto:'.crypt_mail($kom['mail']).'"> '.stripslashes($kom['user']).'</a>'; 
      else echo ' '.stripslashes($kom['user']);
      
      echo ' - '.$kom['date'].'</div>';
      echo '<div><img class="right" src="http://www.gravatar.com/avatar.php?gravatar_id='.md5(trim($value['mail'])).'&rating=PG&size=30&default='.$SETTINGS['URL'].'images/gravatar.gif" />';
      
      if($reakce[$i]){
        foreach($reakce[$i] as $reakce1)
        echo '<div class="reakce">Reakce na <a href="'.GenUrl(array('show'=>'clanek','id'=>$line['link'])).'#post'.$komentar[$reakce1]['id_komentar'].'">['.$reakce1.'] '.$komentar[$reakce1]['user'].'</a></div>';
      }
      
      echo paragraph(stripslashes($kom['text']),1); //formatovani a vypis textu
      
      echo '<div class="odpoved"><a href="javascript:addtag('['.$i.']');document.getElementById('f').text.focus();">Odpovědět</a>';
      
      if($inspirace[$i]){
        foreach($inspirace[$i] as $inspirace1)
        echo '<div class="inspirace">Na tento komentář odpověděl <a href="'.GenUrl(array('show'=>'clanek','id'=>$line['link'])).'#post'.$komentar[$inspirace1]['id_komentar'].'">['.$inspirace1.'] '.$komentar[$inspirace1]['user'].'</a></div>';
      }
      
      echo '</div></div></div>';
      $i++;
    }
  }

Hodnocení

Komentáře

[1] Dundee
2006-09-24 21:19:39

no teda to formátování kódu je děsné...musím s tím něco udělat.

[2] Dundee
2006-10-02 23:46:49

No hned je to lepší :)

2006-10-20 18:49:05

No je to pěkné, jen ještě vychytat přístupnost. Napsat, co má člověk napsat, když neumí JavaScript. A místo tlačítka uložit, odeslat...

[4] Honza
2011-12-13 13:34:57

Jó, taky jsem si všiml to co Šimon. Ale jinak skvělý článek. Díky :)

Komentáře již nelze přidávat