Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP] While - pierwszy przebieg pętli a specyficzny kod
Forum PHP.pl > Forum > Przedszkole
fotexxx
Witam

Mam mały problem.Rozwiazanie go jest pewnie banalne ale jak sie czasem mozna przekonac proste rzeczy potrafia przychodzić najtrudniej..

A wiec może zacznę od kodu smile.gif

  1.  
  2. echo"<div id='gallery'>";
  3. while($row=mysql_fetch_array($sql_result)) {
  4. $tytul=$row["caption"];
  5. $zajawka=$row["snippet"];
  6. $foto=$row["content"];
  7. $url=$row["uri"];
  8. preg_match ('|<img src="(.*)"|U', $foto, $fotka);
  9. echo "<a href='/m/articles/view/$url' class='show'>
  10. <img src='$fotka[1]' width='100%' height='100%' title='' alt='' rel='<h3>$tytul</h3>$zajawka'/>
  11. </a>
  12. ";
  13.  
  14. }
  15. echo"<div class='caption'><div class='content'></div></div>
  16. </div>
  17. <div class='clear'></div>";


problem polega na tym że chciałbym aby tylko w pierwszym przebiegu pętli linia:
  1. echo "<a href='/m/articles/view/$url' class='show'>
  2. <img src='$fotka[1]' width='100%' height='100%' title='' alt='' rel='<h3>$tytul</h3>$zajawka'/>
  3. </a>
  4. ";


wygladała tak jak teraz .Przy kolejnych aż do całkowitego zakonczenia linia powinna wyglądać tak:

  1. echo "<a href='/m/articles/view/$url' >
  2. <img src='$fotka[1]' width='100%' height='100%' title='' alt='' rel='<h3>$tytul</h3>$zajawka'/>
  3. </a>
  4. ";


jedyna zmiana to brak definicji klasy class='show'



moje pytanie brzmi jak to zrobic w najprostszy sposób
Hpsi
Daj sobie przed while $x=0; w while dodawaj za pierwszy obrotem +1 i warunek if ?
fotexxx
a dzieki biggrin.gif

tak jak mowilem...banal smile.gif

chyba musze wiecej spaćbiggrin.gif

aby ladnie zakonczyć temat bo moze komuś sie trafi kiedyś cos podobnego.

Ostatecznie kod wygląda tak i dziala bez zarzutu:

  1. echo"<div id='gallery'>";
  2. $licznik = 0;
  3. while($row=mysql_fetch_array($sql_result)) {
  4. $licznik++;
  5. $tytul=$row["caption"];
  6. $zajawka=$row["snippet"];
  7. $foto=$row["content"];
  8. $url=$row["uri"];
  9. preg_match ('|<img src="(.*)"|U', $foto, $fotka);
  10. if ($licznik == 1){
  11. $show = "class='show'";
  12. }else{
  13. $show ="";
  14. }
  15. echo "<a href='/m/articles/view/$url' $show>
  16. <img src='$fotka[1]' width='100%' height='100%' title='' alt='' rel='<h3>$tytul</h3>$zajawka'/>
  17. </a>
  18. ";
  19.  
  20.  
  21.  
  22.  
  23.  
  24.  
  25. }
  26. echo"<div class='caption'><div class='content'></div></div>
  27. </div>
  28. <div class='clear'></div>";
mortus
Trochę to nieoptymalne. Ja bym zrobił tak:
  1. echo"<div id='gallery'>";
  2. $row = mysql_fetch_array($sql_result);
  3. $tytul=$row["caption"];
  4. $zajawka=$row["snippet"];
  5. $foto=$row["content"];
  6. $url=$row["uri"];
  7. preg_match ('|<img src="(.*)"|U', $foto, $fotka);
  8. echo "<a href='/m/articles/view/$url' class='show'><img src='$fotka[1]' width='100%' height='100%' title='' alt='' rel='<h3>$tytul</h3>$zajawka'/></a>";
  9. while($row=mysql_fetch_array($sql_result)) {
  10. $tytul=$row["caption"];
  11. $zajawka=$row["snippet"];
  12. $foto=$row["content"];
  13. $url=$row["uri"];
  14. preg_match ('|<img src="(.*)"|U', $foto, $fotka);
  15. echo "<a href='/m/articles/view/$url'><img src='$fotka[1]' width='100%' height='100%' title='' alt='' rel='<h3>$tytul</h3>$zajawka'/></a>";
  16. }
  17. echo"<div class='caption'><div class='content'></div></div>
  18. </div>
  19. <div class='clear'></div>";

Brak żadnych dodatkowych instrukcji - również warunkowych.

Co do kodu to mam jeszcze taką uwagę. Co prawda powyższy kod po prostu przepisałem, żeby było widać moje rozwiązanie, jednak w nieprawidłowy sposób wyświetlasz elementy HTML:
  1. // zamiast:
  2. echo "<a href='/m/articles/view/$url'><img src='$fotka[1]' width='100%' height='100%' title='' alt='' rel='<h3>$tytul</h3>$zajawka'/></a>";
  3. // powinno być:
  4. echo "<a href=\"/m/articles/view/$url\"><img src=\"$fotka[1]\" width=\"100%\" height=\"100%\" title=\"\" alt=\"\" rel=\"<h3>$tytul</h3>$zajawka\"/></a>";
  5. // lub też:
  6. echo '<a href="/m/articles/view/'.$url.'"><img src="'.$fotka[1].'" width="100%" height="100%" title="" alt="" rel="<h3>'.$tytul.'</h3>'.$zajawka.'/></a>";

Chodzi o to, że wartości atrybutów (X)HTML według specyfikacji w3c muszą być umieszczone w cudzysłowach (").
nospor
@mortus z tą optymalnością w Twojej wersji to bym polemizował
Powielasz kod
$tytul=$row["caption"];
$zajawka=$row["snippet"];
$foto=$row["content"];
$url=$row["uri"];
preg_match ('|<img src="(.*)"|U', $foto, $fotka);
echo "<a href='/m/articles/view/$url' class='show'><img src='$fotka[1]' width='100%' height='100%' title='' alt='' rel='<h3>$tytul</h3>$zajawka'/></a>";

Ten kod jest powielony. To raz.
A dwa, jak będzie trzeba zrobić jakąś zmianę to przez to powielenie trzeba będzie robić tę zmianę w dwóch miejscach.

Kod, jaki zaproponował fotexxx jest jak najbardziej ok i optymalny.
mortus
Tylko po co co chwile sprawdzać $licznik i deklarować nową wartość zmiennej $show, skoro ona ma istnieć tylko dla pierwszego pobranego rekordu. Powielenie kodu jest w tym przypadku celowe i służy pobraniu pierwszego wiersza zwróconego przez zapytanie. Do tego tak naprawdę powielić trzeba jednokrotnie tylko funkcje mysql_fetch_row(), preg_match() oraz instrukcję echo, reszta to dodatek używany przez autora. Do tego funkcje te tak czy tak będą wykonane dla tego pierwszego rekordu.

Jeśli chodzi o optymalność, to w przypadku niewielkiej liczby danych nie będzie pewnie żadnej różnicy. A co gdy w grę będzie wchodzić 10 milionów rekordów?
Moje rozwiązanie nie wykona nic ponad to, co musi, z czego 999999 razy wykona to w pętli. Natomiast rozwiązanie zaproponowane wyżej wykonuje milion razy szereg instrukcji:
sprawdzenie warunku - przypisanie - konkatenacja (również pustego łańcucha) - wypisanie danych - inkrementacja licznika.

Oczywiście same "operacje" są na tyle banalne, że prawdopodobieństwo zwiększenia wydajności jest zapewne stosunkowo niewielkie, a sam problem pewnie niezbyt często się pojawia.
No i kto przy 10 milionach rekordów wypisuje je wszystkie?

@nospor Nie na darmo użyłem słowa trochę w stwierdzeniu "trochę to nieoptymalne".

W sumie problem, na temat którego nie da się za wiele polemizować, a przy niewielkiej liczbie danych można w ogóle pominąć kwestię optymalności.
nospor
Cytat
@nospor Nie na darmo użyłem słowa trochę w stwierdzeniu "trochę to nieoptymalne".
A ja nie nadarmo wytknąłem ci wady Twojego "trochę" polepszenia, gdyż moim zdaniem to żadne polepszenie. Wręcz uważam, że możesz niechcący w kimś wyrobić zły nawyk, gdyż to co ty zrobiłeś (mówię o kodzie) uważam za "złe" smile.gif

Cytat
A co gdy w grę będzie wchodzić 10 milionów rekordów?
Dla takiej liczby, strona która ma taki kod, niezależnie czy Twój czy autora, to sie w ogóle nie wygeneruje.

To teraz ja: a co gdy kod do powielenia to nie będzie 7 linijek a 70, i nagle się okazuje że musisz zrobić poprawkę? Latasz i szukasz w dwóch miejscach. A co jak się okaze, że następnego dnia znowu musisz zrobić poprawkę? Znowu latasz i szukasz. Optymalnośc to nie tylko wyrzucenie jakiegoś ifa, ale też patrzenia na całość pracy i późniejsze jej modyfikacje.

Cytat
Tylko po co co chwile sprawdzać $licznik i deklarować nową wartość zmiennej $show, skoro ona ma istnieć tylko dla pierwszego pobranego rekordu.
Skoro się martwisz tak bardzo o te dwie zmienne, które niczemu nie szkodzą, to czemu nie napisać tak:
  1. $show = "class='show'";
  2. while($row=mysql_fetch_array($sql_result)) {
  3. $tytul=$row["caption"];
  4. $zajawka=$row["snippet"];
  5. $foto=$row["content"];
  6. $url=$row["uri"];
  7. preg_match ('|<img src="(.*)"|U', $foto, $fotka);
  8. echo "<a href='/m/articles/view/$url' $show>
  9. <img src='$fotka[1]' width='100%' height='100%' title='' alt='' rel='<h3>$tytul</h3>$zajawka'/>
  10. </a>
  11. ";
  12. if ($show) $show = '';
  13. //A jak nie chcesz IF to można poprostu napisać:
  14. //$show=''; - i Już - nie ma IFa
  15. }

Proszę smile.gif
I błagam, nie czepiaj się, że znowu mam IFa - no nie popadajmy w paranoję. Poza tym jak pisałem w komentarzu, można tego ifa wywalić
mortus
No to się czepiał nie będę żadnych if-ów. Jednak Twoje rozwiązanie już się nieco różni od zaproponowanego wyżej i uważam je z bardziej poprawne, również od mojego. Dodam, że nawet moja pierwsza myśl wyglądała niemal identycznie.

Nie pozostaje mi również nic innego, jak zgodzić się z tym, że powielanie kodu jest złe. Po prostu w tak banalnym przypadku to "zło" nie łatwo zauważyć.

Cytat
Optymalnośc to nie tylko wyrzucenie jakiegoś ifa, ale też patrzenia na całość pracy i późniejsze jej modyfikacje.

Zgadzam się. Miałem to na uwadze pisząc kod. Zastanawiałem się jak można rozszerzyć funkcjonalność kodu, generującego obrazkowe odnośniki, w którym wszystkie niezbędne dane są pobierane z bazy danych. Ileż może być tych "przyszłych" modyfikacji? Pierwsza myśl to: "niewiele", ale druga już "niestety" bardziej miarodajna "wszystko zależy od tego, co klient sobie umyśli", co można zinterpretować dosłownie "lepiej nie powielaj kodu".

WNIOSEK 1 (moralno-techniczny lub techniczno-moralny): Zło jest złem, tylko czasem trudno je dostrzec.
WNIOSEK 2: Dobrze, że mamy nospor-a.
nospor
Cytat
WNIOSEK 2: Dobrze, że mamy nospor-a.
Odnoszę wrażenie ironiczności tego zdania. Jeśli mam rację - no naprawdę nie musiałeś.
Jeśli się mylę i mówisz poważnie - bez przesady.

Wtrącając się do dyskusji, nie miałem zamiaru naskakiwać na Ciebie. Uważam Cię za rozsądnego użytkownika forum, który bardzo często mądrze pisze.
Jednak akurat rozwiązanie, które tu zaproponowałeś uznałem, za rozwiązanie czysto akademickie, które w teori być może i jest ciut szybsze, ale w praktyce ma się nijak do zastosowania i przyniesię więcej szkód niż pożytku. Uznałem więc za stosowne się wtrącić.

Cytat
ale druga już "niestety" bardziej miarodajna "wszystko zależy od tego, co klient sobie umyśli", co można zinterpretować dosłownie "lepiej nie powielaj kodu".
No dokładnie. Niestety znam to z autopsji. smile.gif
Hpsi
Jako, że dyskusja toczy się odnośnie mojego zapronowanego rozwiazania - nie podałem rozwiazania a jedynie pomysł jak to można rozwiązać jeśli chce sie zoptymalizować, trzeba chwile pomyśleć - nie ma tak łatwo.
mortus
We wniosku nie było ironii. Chodziło mi o to, że dobrze, że mamy kogoś doświadczonego, kto potrafi dostrzec wspomniane złe nawyki.
Sam się ciągle uczę i popełniam błędy, i dobrze jest, jeśli te błędy ma kto wskazać i wytłumaczyć.

W życiu codziennym nie obrażam nikogo. Niezależnie od tego, czy mam rację i potrafię to udowodnić, czy też racji nie mam. Od którejś tam klasy szkoły podstawowej uważam, że takie szczeniackie zachowania nie mają sensu.
nospor
Cytat
Jako, że dyskusja toczy się odnośnie mojego zapronowanego rozwiazania - nie podałem rozwiazania a jedynie pomysł jak to można rozwiązać jeśli chce sie zoptymalizować, trzeba chwile pomyśleć - nie ma tak łatwo.
@mortus chodź go nastukamy, bo sie wcina bez sensu do poważnej rozmowy.... wink.gif

phpion
@mortus:
Jak już się bawisz w "optymalizowanie" to moje uwagi do Twojego kodu:

1. Nie nadużywaj echo. Wydajniej jest dopisywać nowy ciąg znaków do jakiejś zmiennej i później ją wyświetlić niż każdorazowo wypluwać fragmenty na wyjście.
2. Używaj ' zamiast " w PHP - powodu chyba nie muszę podawać.
3. Po co używasz mysql_fetch_array skoro i tak operujesz tylko na tablicy asocjacyjnej? Użyj mysql_fetch_assoc.
4. Powoływanie nowych zmiennych (zamiast odwoływać się do elementów tablicy) tylko po to by skrócić sobie zapis też wydaje się zbędne.

Miłego dnia smile.gif
nospor
Oj phpion, teraz to ty sie czepiasz mortusa bez potrzeby tongue.gif Poza tym tylko ja mam prawo "czepiać" sie mortusa... wykupiłem u niego abonament wink.gif

ad2) Przecież pod spodem podał poprawny kod.
ad3, ad4) mortus jedynie skopiował kod autora by pokazać swój zamysł. Zamysłem było wyodrębnienie kodu, by pozbyć sie dodatkowych obliczeń w pętli.

"Mój kod" w zasadzie posiada wszystkie wady, które wymieniłeś. Ale ja też skopiowałem tylko kod autora i wprowadziłem do niego tylko parę poprawek by pokazać inny zamysł. smile.gif
mortus
Cytat(mortus @ 22.06.2011, 11:51:45 ) *
Co prawda powyższy kod po prostu przepisałem...


W sumie, to cytat mówi sam za siebie.

EDIT
No i ktoś to już zauważył.
nospor
Cytat
W sumie, to cytat mówi sam za siebie.
Moderatorzy na tym forum są tacy nierozgarnięci... powinno się ich wszystkich wywalić, bo prostej rzeczy nie umieją przeczytać wink.gif
phpion
Cytat(nospor @ 22.06.2011, 14:50:54 ) *
Moderatorzy na tym forum [...]

Racja. Dobrze, że jestem opiekunem smile.gif hehe
nospor
....
Miałem coś napisać, ale boję się, że wkońcu ktoś to przestanie traktować żartem i się jeszcze obrazi wink.gif Koniec tego OFFTOPU tutaj, bo normalnie...normalnie...... autorowi tematu dam +10% biggrin.gif
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.