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(' ', $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
Komentarz użytkownika Wasacz
08 06 2010Za 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?
Komentarz użytkownika tmszdmsk
08 06 2010Niby 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 ;)
Komentarz użytkownika BTM
08 06 2010Wą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 :)
Komentarz użytkownika Wasacz
08 06 2010A 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”.
Komentarz użytkownika tmszdmsk
08 06 2010BTM: 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ć.
Komentarz użytkownika radmen
08 06 2010BTM: 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ć.
Komentarz użytkownika Wasacz
08 06 2010Radmen, serio? Myślałem, że to legendy.
Komentarz użytkownika radmen
08 06 2010@Wasacz: sprawdzone w praktyce. Ludzie, którzy rzekomo mają magistra mieli z tym problem.
Komentarz użytkownika teamon
08 06 2010Jak patrze na ludzi u nas na roku (I rok INF/PWR) to zaczynam wierzyc w fizzbuzz
Komentarz użytkownika tmszdmsk
08 06 2010@teamon: z drugiej strony trzeba wziąć pod uwagę, że informatyka to nie tylko programowanie.
Komentarz użytkownika teamon
08 06 2010No ale po odjeciu myslenia (ktorego brakuje) to juz nic innego nie zostaje...
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ć ;-)
Komentarz użytkownika Hoppke
09 06 2010Zacznijcie pytac kandydatow o zasade dzialania jakiejs struktury asocjacyjnej, mozna odsiac nawet nie siadajac do komputera :)
Komentarz użytkownika Peter_D
17 06 2010Ja 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 ;)