Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]Usunięcie niechcianego przecinka
Forum PHP.pl > Forum > Przedszkole
Greg23
Mam skrypt, który wyświetla mi na stronie tagi:

  1. if (!empty($rekordow2[8])){
  2. echo '<p>Tagi: ';
  3. $tags24=explode(",", $rekordow2[8]);
  4.  
  5. foreach($tags24 as $f ){
  6. echo "<a href='' title='".$f."'><strong>$f</strong></a>, ";
  7.  
  8. }
  9. echo '</p>';
  10. }


W wyniku dostaję coś takiego:
  1. Tagi: ala, ma, kota,


Jak pozbyć się tego ostatniego, niepotrzebnego przecinka ?

!*!
  1. trim($tag, ',')
matty7
  1. $x = 0;
  2. foreach($tags24 as $f ){
  3. echo "<a href='' title='".$f."'><strong>$f</strong></a>";
  4. if($x++ == count($rekordow2[8])) echo ", "; else echo " ";
  5. }
Greg23
Matty, Twój pomysł nie do końca działa, co prawda nie mam na końcu przecinka, ale na początku też smile.gif
Coś takiego dostaje:
  1. ala ma, kota


a gdy zmienie $x=0 na $x=1 to dostaje:
  1. ala, ma kota


Próbowałem zmienić:
  1. if($x++ == count($rekordow2[8])) echo ", "; else echo " ";

na
  1. if($x++ < count($rekordow2[8])) echo ", "; else echo " ";


ale dalej lipa :/
piotrex41
Powinno zadziałać:
  1. if (!empty($rekordow2[8]))
  2. {
  3. $tags24=explode(',', $rekordow2[8]);
  4. foreach($tags24 as $f)
  5. {
  6. $s .= '<a href='' title='".$f."'><strong>$f</strong></a>, ';
  7. }
  8. $s = substr($s, 0, -1);
  9. echo '<p>Tagi: '.$s.' </p>';
  10. }
Greg23
Działa świetnie smile.gif
Bardzo dziękuję za pomoc!
irmidjusz
Nie wiem, co to za dziwactwa ludziska wyprawiają z tym doklejaniem łańcuchów i usuwaniem ostatniego przecinka (czy jakiegokolwiek innego znaku).
A można prościej, tak:

  1. if (!empty($rekordow2[8]))
  2. {
  3. $tagi = array();
  4. foreach(explode(',', $rekordow2[8]) as $f)
  5. {
  6. //tutaj odpowiednio sformatowane elementy, co tam chcemy...
  7. $tagi[] = '<a href="" title="'.$f.'"><strong>'.$f.'</strong></a>';
  8. }
  9. //a to ładnie skleja je do stringa z dowolnym łańcuchem łączącym pomiędzy elementami, niczego zbędnego na końcu ani na początku nie ma...
  10. $s = implode(',', $tagi);
  11. echo '<p>Tagi: '.$s.' </p>';
  12. }

SmokAnalog
Cytat(irmidjusz @ 13.07.2012, 03:00:09 ) *
Nie wiem, co to za dziwactwa ludziska wyprawiają z tym doklejaniem łańcuchów i usuwaniem ostatniego przecinka (czy jakiegokolwiek innego znaku).

Zgadzam się! Niestety PHP w całej tej swojej "łatwości" w wielu osobach zakorzenia programistyczną bylejakość, złe nawyki, klejenie potworków. Chociaż Twój sposób, irmidjusz, jest niewiele lepszy smile.gif Zamiast tych zmiennych/tablic-potworków, wystarczy sprawdzać czy osiągnięto już koniec (lub przerobić na sprawdzanie czy początek):
  1. <?php if($f !== end($tags24)): ?>, <?php endif; ?>
markonix
SmokAnalog co jeżeli wartość się powtarza?

Cytat
ala, ma, kota, i, nic, nie, ma
irmidjusz
złapał markonix smoka za ogon wink.gif
SmokAnalog
Racja, wtedy pozjada część przecinków biggrin.gif

Ale i tak jest lepszy sposób:
  1. $separator = '';
  2. foreach($tablica as $element) {
  3. echo $separator.'<a href="">'.$element.'</a>';
  4. $separator = ', ';
  5. }
irmidjusz
No, co kto lubi, ja preferuję:
  1. $temp = array();
  2. foreach($tablica as $element){
  3. $temp[] = '<a href=""'.$element.'</a>';
  4. }
  5. echo implode(', ', $temp);

Rzecz gustu smile.gif
markonix
Wydaje mi się, że sposób z tymczasową tablicą i funkcją implode jest ździebko bardziej pamięciożerny więc osobiście wybrałbym pomysł poprzednika.
Wygodniejszy byłby także gdy stosujemy system szablonów oparty o surowe PHP. Wtedy wygląda to znacznie prościej dla ewentualnego kodera HTML.
Wygląda także znacznie lepiej bo gdyby struktura HTMLowa znajdująca się w pętli byłaby dość pokaźna (tak, że wygodniej zamiast echo byłoby lepiej umieścić poza znacznikami php) to wrzucanie tego do tablicy wyglądałoby niefortunnie.
SmokAnalog
Cytat(irmidjusz @ 14.07.2012, 12:35:25 ) *
Rzecz gustu smile.gif

Nie tylko gustu smile.gif Wrzucanie fragmentów kodu HTML do zmiennych jest przeważnie złym pomysłem. Jeśli można coś wypluć od razu z echo, to najlepiej tak zrobić Tym bardziej, że jak tych tagów będzie więcej niż kilka, to zbieranie ich kodu w tablicy, a następnie łączenie z implode wcale nie jest błyskawiczną operacją.
irmidjusz
Przekonaliście mnie, rzeczywiście ten zapis SmokaAnaloga wygląda prościej, czytelniej smile.gif
Chociaż osobiście nie lubię pisać tego typu konstrukcji, gdzie wykonuje się coś niepotrzebnie mnóstwo razy (jak to przypisanie separatora w pętli), to jednak w typowych zastosowaniach nie ma to żadnego znaczenia i dla uproszczenia kodu jest OK. Działa dobrze i jest łatwe w czytaniu i to mnie przekonało.

Natomiast jeśli chodzi o czas wykonania czy zużycie pamięci:

1.
Jeśli echo ma wypluć niewielkie ilości niedługich łańcuchów, to czas wykonania czy pamięciożerność w ogóle się nie liczy smile.gif Dla tak małych liczb, są to rzeczy zupełnie bez znaczenia i pomijalne i nie ma nawet się co zastanawiać nad tym czy coś się wykona szybciej albo zajmie mniej RAMu, bo są to nieistotne różnice. Gdybanie o tym, co jest szybsze od czego nie jest profilowaniem i często ma się nijak do rzeczywistości. W ogóle rozmyślanie o tym i używanie jako argumentów, że jakieś rozwiązanie jest lepsze od innego, jest w takim przypadku (małych ilości przetwarzanych elementów) bez sensu.

Co to są "niewielkie ilości"? Zależy smile.gif Ale w praktyce, ile takich elementów wyświetlisz? 100? 500? Więcej się zwykle nie daje, bo to utrudnia przeglądanie strony - do tego jest paginacja albo filtrowanie. Nawet dla 500 kilkuset znakowych łańcuchów nie ma praktycznego znaczenia, który sposób zastosujesz. No chyba, że piszesz w PHP aplikację na najnowszy zegarek Bonda z wbudowanym mikroserwerem www z 1 MB RAMu dla PHPa, wówczas to co innego... ;P

A teraz zagadka: przy jakiej ilości elementów w tablicy będzie różnica wykonania rzędu 100 ms? Zależy od serwera smile.gif ale mogę strzelać, że będą to ilości 100000+ (o ile oczywiście nie sprawdzamy na zegarku Bonda z prockiem 400 MHz... biggrin.gif) Poza tym, takie rzeczy to się sprawdza w realnym środowisku wykonawczym podczas profilowania i optymalizuje tylko wtedy, gdy w ogóle ma jakiekolwiek istotne znaczenie.

2.
Jeśli echo nie jest buforowane, to im więcej operacji echo, tym dłużej to trwa i prosty test pokazuje, że dla dużych ilości echo, lepiej jest zgromadzić stringi w tablicy i wypluć jednym echo implode, bo trwa to sumarycznie krócej. Oczywiście, można też gromadzić w tymczasowym stringu i wypluć go na koniec w całości. A najszybciej (i zużywa najmniej RAMu) jest stosować echo przy włączonym buforowaniu.

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.