|
Страници по тази тема: 1 | 2 | >> (покажи всички)
Тема
|
рекурсия и масиви
|
|
Автор | k (Нерегистриран) |
Публикувано | 24.01.03 20:32 |
|
Здравейте,
дайте идейка как може да се реши следния проблем: с рекурсивна функция (ох колко ги обичам) се опитвам да изведа сортиран по име списък на категориите въведени в дървовиден тип от 1 мускл таблица.
Като краен резултат от функцията искам да получа масив с всички фетчвани записи
$a[0][Rid]
$a[0][Category]
$a[1][Rid]
$a[2][Category]
и т.н.
ф-ята има следния вид
function x($currentid) {
static $i=0;
$sql = "SELECT ..... WHERE ParentId='$currentid'";
$result=mysql_query($sql,$db);
while ($A[$i] = mysql_fetch_array($result)) {
......
$A = x($A[$i][Rid]); // tuk triabva da e neshto drugo
$i++;
}
return $A;
}
проблемът е как да съединявам получените масиви от всяко повикване на ф-ята
пробвах array_match, но нищо не се получи (зависва)
накратко казано, как да реализирам рекурсия, която връща резултат масив?
правили ли сте такова нещо?
| |
Тема
|
Re: 1 kurs MEI
[re: k]
|
|
Автор |
Dremesht (спящ) |
Публикувано | 25.01.03 02:00 |
|
ne mi se misli tochno po tova vreme i tochno po tvoiata zadacha, zatova ti davam neshtata koito sum gi pravil predi 2 godini, moje i da ne sa mnogo efektivni no v momenta gi polzvam
get_listtree gleda tablicata $table sus structura "id|parent:name"ti vrushta dobaviane kum dropdown listbox ("list") vsichkite lista ot parent vuzela "$parent" i selektira v tiah reda s id "$mch"
function get_listtree($table, $list,$parent,$mch)
{
$result=mysql_query("SELECT id, name FROM $table WHERE parent='$parent' ORDER BY name ASC");
while($row=mysql_fetch_array($result)):
$id=$row["id"];
$name=stripslashes($row["name"]);
$level=get_deeplevel($id,$table);
$lines="";$insidelist="";
for($i=0;$i<$level;$i++): $lines.=" "; endfor;
if($id==$mch):$sel=" selected";else: $sel="";endif;
$list.="<option value=\"$id\"$sel>$lines$name</option>\n";
$insidelist=get_listtree($insidelist,$id,$mch);
$list.=$insidelist;
endwhile;
return $list;
}
function get_deeplevel($cl, $table)
{
$level=0;
$parent=mysql_result(mysql_query("SELECT parent FROM $table WHERE id='$cl'"),0,'parent');
while($parent):
$parent=mysql_result(mysql_query("SELECT parent FROM $table WHERE id='$parent'"),0,'parent');
$level+=1;
endwhile;
return $level;
}
tova biaha spomeni, sega predpolagam che niama da imash problemi da gi razviesh neshtata do tova koeto ti triabva, a oshte poveche ne se i samniavam che shte gi post-nesh rezultatite tuk v tozi forum.
| |
Тема
|
Re: BTW
[re: k]
|
|
Автор |
Dremesht (спящ) |
Публикувано | 25.01.03 02:04 |
|
s pascal ne stavat li neshtata che si padnal kum PHP, po dobre da go ostavish i da pochnesh da uchish .net ... shte ni se mahne glavobolieto i suma ti vaprosi porodeni ot lipsata na obrazovanieto.
| |
Тема
|
Re: 1 kurs MEI
[re: Dremesht]
|
|
Автор | k (Нерегистриран) |
Публикувано | 25.01.03 10:18 |
|
въобще няма никакъв проблем да се реализира ф-я от вида
function x($param) {
......
niakakav_cikal {
if (uslovie) {
$output .= x($stoinost);
}
} //end cikal
return $output;
}
натрупването на резултата в стринг е лесно, но не искам в тялото на ф-ята да вкарвам форматирането на изхода и разни нтмл тагове (всъщност в момента съм го направила така, поради липса на по-умно решение). Ако се реализира с натрупване на стойностите "във вид удобен за логаритмуване" така да се каже, ф-ята ще стане универсална, с много приложения, докато при решение със стринг мога да я ползвам само в конкретния случай - не е ли тъпо а?
Проблемът е как да се реализира ф-ята да връща МАСИВ, който между отделните повиквания да "сглобява" получените до момента елементи и, най-важното, той да се запази двумерен. Защото едно просто присвояване в рекурсивна ф-я ще доведе до следното
$A[0][Rid]
$A[1][0][Rid]
$A[1][1][Rid]
$A[1][1][0][Rid] или нещо подобно
| |
Тема
|
Re: 1 kurs MEI
[re: Dremesht]
|
|
Автор | k (Нерегистриран) |
Публикувано | 25.01.03 10:20 |
|
определено има по-елегантни решения за твоето примерче
| |
Тема
|
Re: 1 kurs MEI
[re: k]
|
|
Автор |
Дpeмeщ (заспал) |
Публикувано | 25.01.03 10:33 |
|
znam che ima, stiga da preodolea marzela si i da pomislia polovin chas, inache tozi primer mi se nalaga da go polzvam vednuj godishno
-----------------------
гърбавия ковчега ще го изправи
| |
Тема
|
Re: 1 kurs MEI
[re: k]
|
|
Автор |
Дpeмeщ (заспал) |
Публикувано | 25.01.03 10:49 |
|
$count=0;
$a=array();
function x($param1){
global $a;
global $count;
$result=mysql_query("SELECT id, name FROM table WHERE parent=$param1");
if(mysql_num_rows($result)):
while($row=mysql_fetch_array($result)):
$a[$count][]=$row["id"];
$a[$count][]=$row["name"];
$count++;
x($row["id"]);
endwhile;
endif;
}
basi ... vse edno che e niakva olimpiada po programiraneto.
-----------------------
гърбавия ковчега ще го изправиРедактирано от Дpeмeщ на 25.01.03 10:51.
| |
Тема
|
Re: 1 kurs MEI
[re: Дpeмeщ]
|
|
Автор | k (Нерегистриран) |
Публикувано | 25.01.03 14:46 |
|
даааа..........
това е един начин, все пак може да се помисли въпроса да се реши без глобална променлива.
10х
А относно последната ти реплика: та нали сме тук и за да пофилософстваме, иначе е много сухарско
![](http://i.dirbg.com/clubs/icons/laugh.gif)
| |
Тема
|
Re: 1 kurs MEI
[re: k]
|
|
Автор |
Дpeмeщ (заспал) |
Публикувано | 25.01.03 17:41 |
|
nai-dobroto filosoftvane e na kruchmata :))
-----------------------
гърбавия ковчег ще го изправи
| |
Тема
|
Re: рекурсия и масиви
[re: k]
|
|
Автор |
ro6avia (mnogo ro6avia) |
Публикувано | 25.01.03 19:51 |
|
A siguren li si 4e ti triabva rekursivna funkcia ? Tui kakto gledam kakvo si napisal mi se varti iz glavata 4e moze6 da napravi6 tala :
$sql = "SELECT Id,ParentId, Catigory from table";
$result=mysql_query($sql,$db);
while ($row= = mysql_fetch_array($result)) {
$A[$row[0]]['category']=$row[2];
$A[$row[0]]['Rid']=$row[1];
}
koeto ti dava masiv s parvi index ID-to, v category ima6 kategoriata a v ['Rid'] -> ParentId-to
dosta po-barzo 6te raboti i izbiagva6 rekursiata.
A ako iska6 rekursia za6toto sa ti podali zada4ka tova e drug vapros. Kazi mi strukturata na Db-to i to4nia format na izhodnite danni i 6te pomislim po vaprosa
E tuk ni6to niama :
| |
|
Страници по тази тема: 1 | 2 | >> (покажи всички)
|
|
|