Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [PHP]Usunięcie niechcianego przecinka
Greg23
post 12.07.2012, 12:38:43
Post #1





Grupa: Zarejestrowani
Postów: 120
Pomógł: 0
Dołączył: 6.04.2012

Ostrzeżenie: (0%)
-----


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 ?



--------------------
Go to the top of the page
+Quote Post
!*!
post 12.07.2012, 12:41:03
Post #2





Grupa: Zarejestrowani
Postów: 4 298
Pomógł: 447
Dołączył: 16.11.2006

Ostrzeżenie: (0%)
-----


  1. trim($tag, ',')


Ten post edytował !*! 12.07.2012, 12:41:32


--------------------
Nie udzielam pomocy poprzez PW i nie mam GG.
Niektóre języki programowania, na przykład C# są znane z niezwykłej przenośności (kompatybilność ze wszystkimi wersjami Visty jest wiele warta).
Go to the top of the page
+Quote Post
matty7
post 12.07.2012, 12:51:15
Post #3





Grupa: Zarejestrowani
Postów: 85
Pomógł: 0
Dołączył: 23.12.2006
Skąd: Będzin / Kraków

Ostrzeżenie: (0%)
-----


  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. }
Go to the top of the page
+Quote Post
Greg23
post 12.07.2012, 13:01:39
Post #4





Grupa: Zarejestrowani
Postów: 120
Pomógł: 0
Dołączył: 6.04.2012

Ostrzeżenie: (0%)
-----


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 :/


Ten post edytował Greg23 12.07.2012, 13:07:31


--------------------
Go to the top of the page
+Quote Post
piotrex41
post 12.07.2012, 13:12:36
Post #5





Grupa: Zarejestrowani
Postów: 168
Pomógł: 26
Dołączył: 15.09.2011
Skąd: Wrocław

Ostrzeżenie: (0%)
-----


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. }


Ten post edytował piotrex41 12.07.2012, 13:13:54


--------------------
www.piotrex41.pl - piotrex41 portfolio
d(-.-)b - Music is my life || PHP is my passion
Go to the top of the page
+Quote Post
Greg23
post 12.07.2012, 13:37:46
Post #6





Grupa: Zarejestrowani
Postów: 120
Pomógł: 0
Dołączył: 6.04.2012

Ostrzeżenie: (0%)
-----


Działa świetnie smile.gif
Bardzo dziękuję za pomoc!


--------------------
Go to the top of the page
+Quote Post
irmidjusz
post 13.07.2012, 02:00:09
Post #7





Grupa: Zarejestrowani
Postów: 279
Pomógł: 60
Dołączył: 25.02.2012

Ostrzeżenie: (0%)
-----


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. }



--------------------
there is much to be learned
Go to the top of the page
+Quote Post
SmokAnalog
post 13.07.2012, 08:33:56
Post #8





Grupa: Zarejestrowani
Postów: 1 707
Pomógł: 266
Dołączył: 3.07.2012
Skąd: Poznań

Ostrzeżenie: (0%)
-----


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; ?>
Go to the top of the page
+Quote Post
markonix
post 13.07.2012, 10:30:24
Post #9





Grupa: Zarejestrowani
Postów: 2 707
Pomógł: 290
Dołączył: 16.12.2008
Skąd: Śląsk

Ostrzeżenie: (0%)
-----


SmokAnalog co jeżeli wartość się powtarza?

Cytat
ala, ma, kota, i, nic, nie, ma


--------------------
Go to the top of the page
+Quote Post
irmidjusz
post 13.07.2012, 20:06:06
Post #10





Grupa: Zarejestrowani
Postów: 279
Pomógł: 60
Dołączył: 25.02.2012

Ostrzeżenie: (0%)
-----


złapał markonix smoka za ogon wink.gif


--------------------
there is much to be learned
Go to the top of the page
+Quote Post
SmokAnalog
post 14.07.2012, 00:25:52
Post #11





Grupa: Zarejestrowani
Postów: 1 707
Pomógł: 266
Dołączył: 3.07.2012
Skąd: Poznań

Ostrzeżenie: (0%)
-----


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. }
Go to the top of the page
+Quote Post
irmidjusz
post 14.07.2012, 11:35:25
Post #12





Grupa: Zarejestrowani
Postów: 279
Pomógł: 60
Dołączył: 25.02.2012

Ostrzeżenie: (0%)
-----


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


--------------------
there is much to be learned
Go to the top of the page
+Quote Post
markonix
post 14.07.2012, 13:09:41
Post #13





Grupa: Zarejestrowani
Postów: 2 707
Pomógł: 290
Dołączył: 16.12.2008
Skąd: Śląsk

Ostrzeżenie: (0%)
-----


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.


--------------------
Go to the top of the page
+Quote Post
SmokAnalog
post 15.07.2012, 07:49:11
Post #14





Grupa: Zarejestrowani
Postów: 1 707
Pomógł: 266
Dołączył: 3.07.2012
Skąd: Poznań

Ostrzeżenie: (0%)
-----


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ą.
Go to the top of the page
+Quote Post
irmidjusz
post 15.07.2012, 12:48:46
Post #15





Grupa: Zarejestrowani
Postów: 279
Pomógł: 60
Dołączył: 25.02.2012

Ostrzeżenie: (0%)
-----


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.



--------------------
there is much to be learned
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 21.06.2025 - 11:27