EpicWEB.pl

webdesign, programowanie, phat lewt!

Ostatni projekt

ddrpl.com

Ostatnie wiadomości

PHP - generowanie mapy witryny

Generowanie mapy witryny - prosta, wydawało by się - rzecz. Jednak, kiedy w naszej firmie pojawiło się wolne stanowisko programisty postanowiliśmy właśnie takie zadanie dać kandydatom do zrealizowania, w celu odsiania "programistów" od programistów.

Zadanie okazało się jednak wykraczające poza wszelkie normy i na jakieś 20 osób (na przestrzeni 5 miesięcy) udało się je zrobić 5. Z tego dwie skopiowały (nie do końca działające) rozwiązania z sieci...

Twoje zadanie - mając tabelę (CREATE TABLE `_tree` (`id` INT(11), `parent` INT(11), `sort` INT(11), `nazwa` VARCHAR(255))) napisz skrypt, który wygeneruje mapę witryny w HTML (w dowolnym standardzie). Większość osób zaczyna od napisania prostego zapytania wyciągającego wszystkie wpisy z parent = 0. Nieliczni dodadzą jeszcze sort. Później, jeżeli ktoś już to zrobi przystępuje do zagnieżdżania kolejnych poziomów while() a nam ręce opadają ...

Dlatego, drogi poszukiwaczu odpowiedzi w sieci, poniżej zamieszczam dwa rozwiązania - wykuj się ich na pamięć, przyjdź do nas i pewnie dostaniesz posadkę ...

Rozwiązanie 1 - rekurencja - dużo zapytań do SQL, mało myślenia:

function lev($parent) {
	$query = mysql_query('SELECT * FROM `_tree` WHERE `parent` = '.(int)$parent.' ORDER BY `sort` ASC');
	if(mysql_num_rows($query)) {
		echo '<ul>'."\n";
		while($dane = mysql_fetch_array($query, 1)) {
			echo '<li>'."\n";
			echo $dane['nazwa']."\n"; 
			lev($dane['id']);
			echo '</li>'."\n";
		}
		echo '</ul>'."\n";
	}
}

lev(0);

Rozwiązanie 2 - jedno zapytanie, nieco więcej myślenia:

function getData($parent) {
    $query = mysql_query('SELECT * FROM `_tree` WHERE `parent` >= '.(int)$parent.' ORDER BY `parent` ASC, `sort` ASC');
    $return = array();
    while($dane = mysql_fetch_array($query, 1)) {
        $return[] = $dane;
    }
    return $return;
}

function sortData($data, $root = 0, $level = 0) {
    static $return = array();
    foreach($data as $item) {
        if($item['parent'] == $root) {
            $item['level'] = $level;
            $return[] = $item;
            sortData($data, $item['id'], $level+1);
        }
    }
    return $return;    
}
foreach(sortData(getData(0)) as $item) {
    echo str_repeat('&nbsp;', $item['level'] * 5).$item['nazwa'].'<br />';
}

Niech mi ktoś powie, że to jest mega skomplikowane? Dzisiaj pojawił się jeden człowiek, który był po 2 kierunkach na Politechnice Łódzkiej. Po godzinie nic nie zrobił. Drugi - stwierdził, że pracował w Prado (taki framework) - więc zainstalował sobie WAMP na laptopie, zassał Prado i ... po 2 godzinach wyszedł bez "do widzenia".

Komentarze

Avatar użytkownika 1

Komentarz użytkownika Wasacz

08 06 2010

Za to mysql_fetch_array($query, 1), a konkretnie za „1”, to bym łapy uciął.

Edit: to się przypadkiem nie zepsuje, jeśli będzie wywołane drugi raz?

2

Komentarz użytkownika tmszdmsk

08 06 2010

Niby jestem na studiach informatycznych, poziom jeśli chodzi o zdolność wymyślenia jak coś napisać nie jest zbyt wysoki, ale serio aż tak ciężko znaleźć kogoś kto potrafiłby to rekurencyjnie zrobić?

W tym momencie chciałem zaflejmować delikatnie, że może dlatego, że to jednak PHP, ale się powstrzymam(choć jak widać nie do końca ;)

Avatar użytkownika 3

Komentarz użytkownika BTM

08 06 2010

Wąsacz: to już jest czepianie się. Wiem, powinno być mysqlfetchassoc() albo MYSQLFETCHASSOC zamiast 1.

Co do editu - zepsuje się, to jest tylko kod "jednorazowy" do tej konkretnej notki.

@tmszdmsk: no niestety, na to wychodzi, że jednak trudno. I proszę bez flejmowania :)

Avatar użytkownika 4

Komentarz użytkownika Wasacz

08 06 2010

A przypomniało mi się, jak widziałem mapę strony pisaną w Zendzie. Znaczy, w Zendzie… Ktoś wziął model i pobierał z bazy wszystko, łącznie z pełną treścią artykułów, a potem wypisywał tylko tytuły w linkach. Wczytywało się to kilkanaście sekund, ale „nie zauważyłem”.

5

Komentarz użytkownika tmszdmsk

08 06 2010

BTM: Tym lepiej dla mnie. Wygląda na to, że nie będę miał zbyt dużej konkurencji na rynku pracy :) Chociaż, z drugiej storny, będę musiał później z takimi pracować.

Avatar użytkownika 6

Komentarz użytkownika radmen

08 06 2010

BTM: Wow, macie mega trudne zadanie ;) Słyszałeś o pętli "FizzBuzz"? Nawet coś takiego zabija. U nas większość osób nie wiedziała jak się za to zabrać.

Avatar użytkownika 7

Komentarz użytkownika Wasacz

08 06 2010

Radmen, serio? Myślałem, że to legendy.

Avatar użytkownika 8

Komentarz użytkownika radmen

08 06 2010

@Wasacz: sprawdzone w praktyce. Ludzie, którzy rzekomo mają magistra mieli z tym problem.

Avatar użytkownika 9

Komentarz użytkownika teamon

08 06 2010

Jak patrze na ludzi u nas na roku (I rok INF/PWR) to zaczynam wierzyc w fizzbuzz

10

Komentarz użytkownika tmszdmsk

08 06 2010

@teamon: z drugiej strony trzeba wziąć pod uwagę, że informatyka to nie tylko programowanie.

Avatar użytkownika 11

Komentarz użytkownika teamon

08 06 2010

No ale po odjeciu myslenia (ktorego brakuje) to juz nic innego nie zostaje...

Avatar użytkownika 12

Komentarz użytkownika BTM

09 06 2010

@radmen: słyszałem. Myślisz, że ktoś dał by radę zrobić FizzBuzz, jak nie robi tego zadania? Poza tym, jeżeli nawet ktoś zrobi FizzBuzz, a nie zrobi tego zadania, to ja nie chcę z nim pracować :D

@tmszdmsk: nie, nie tylko programowanie, ale wydaje mi się, że każdy kierunek informatyczny ma jakieś tam podstawy programowania i rekurencja zapewne jest na każdym z nich. Serio, ja rozumiem, że nie każdy pewnie w czasie kariery generował drzewo z takiej bazy, ale tu byli ludzie, którzy kopiowali kod z Google i tak go przerabiali, że przestawał działać ;-)

13

Komentarz użytkownika Hoppke

09 06 2010

Zacznijcie pytac kandydatow o zasade dzialania jakiejs struktury asocjacyjnej, mozna odsiac nawet nie siadajac do komputera :)

14

Komentarz użytkownika Peter_D

17 06 2010

Ja programistą Php nie jestem i nie mam nawet aspiracji by nim być, ale kiedyś chciałem sobie to napisać i przy minimum wiedzy i trochę pomyślunku napisałem to w 20 min ;) I jestem z tego przeniezmiernie dumny ;)
Mogę jedynie przez to myśleć, że kandydaci są średniej jakości ;)

Zostaw komentarz