Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Operator identyczności "==="
Forum PHP.pl > Forum > PHP
wojcup
Jestem tu nowy zatem jeśli coś jest nie tak proszę o wyrozumiałość i rzeczowe uwagi.

Problem:
Prosta funkcja: dostaje 2 wartości (tekst oraz ilość znaków). Chcę aby w zadanym fragmencie tekstu np 35 znaków znalazł ostatnią spację i tekst od początku do ostatniej spacji wyświetlił razem z "...".


  1. function skrot($text="", $ile=10){
  2.  
  3.         $pos=strrpos(substr((string)$text,0,(int)$ile), ' '); // najpierw skracam $text do 30 znaków i szukam w nim ostatniej spacji, konwertuje przy tym zmienne $text-> string a $ile -> int. Dostaję położenie ostatniej spacji (ale mniejsze niż zadana liczba)
  4.  
  5.  if($pos===true){           // tu problem: za każdym razem idzie w 'else' tzn. warunek nie jest spełniony
  6.  
  7.         $text=substr($text,0,$pos)." ..."; //nowy $text jest fragmentem do ostatniej spacji poniżej $ile znaku. Doklejam '...'
  8.         } else {
  9.         $text=substr((string)$text,0,(int)$ile)." ..."; //nie znalazł żadnej spacji zatem nowy $text jest fragmentem $ile znaków. Doklejam '...'
  10.         echo "było false"; // a to takie pomocnicze, żebym wiedział co się działo :)
  11.         }
  12.         return $text;
  13. }



Zgodnie z manualem na php.net powinno zadziałać w takiej formie. Niestety tak jak napisałem warunek nie waliduje się, mimo, iż podaję prawidłowe wartości (jakiś tekst ze spacjami i wartość $ile taką, że znajdzie spację). Co więcej przy prawidłowych wartościach w sekcji 'else ...' jak dam var_dump($pos) wyskoczy mi że $pos jest np. int (28).
Po dłubaniach doszedłem do wniosku, że $pos dostaje wartość np. 28 i wtedy nijak nie sprawdzi warunku $pos===true, bo true jest typu boolean (0 lub 1). Jedynym rozwiązaniem wydaje mi się kruczek:
  1. $spr=(bool)$pos;
  2. if($spr===true){
  3. $text=substr($text,0,$pos)." ...";
  4. } else ....

czyli wstawiłem dodatkową zmienną $spr, która dostaje wartość z $pos i przerabiam ją na boolean. Mogę sobie teraz sprawdzić $spr (identyczne z $pos). Jeśli ona jest true to reszta pozostaje bez zmian.
Prośba do Was, drodzy forumowicze: czy jest lepsze rozwiązanie?
ziqzaq
Przejdź sobie na stronę dokumentacji strrpos i przeczytaj dokładnie sekcję "Return Values" i sprawdź czy ta funkcja zwraca w ogóle "true".

// Edyta.

Sory. Nie doczytałem.
Masz taki przykładzik:
  1. if (strrpos($tekst, $szukany) !== false) {
  2. // znaleziono
  3. } else {
  4. // ...
  5. }
wojcup
Tak czytałem to. Wiem, że ona zwraca numer pozycji, ale poniżej też jest przykład, który miał pokazać prawidłowe działanie:

  1. $pos = strrpos($mystring, "b");
  2. if ($pos === false) { // note: three equal signs
  3. // not found...
  4. }


no i u mnie nie sprawdził się... Szukam lepszego i bardziej fachowego niż moje rozwiązania mojego tematu.

Dzięki ziqzaq! Rzeczywiście w tym zapisie wszystko działa. Próbowałem czy w tekście bez spacji wszystko jest ok ale działą. Super!

Mam jeszcze krótkie pytanie: jeśli nie podam żadnej wartości $ile nie wstawia mi domyślnej 10 za $ile. Dlaczego?
ziqzaq
Na pewno nie masz domyślnej wartości?
  1. function skrot($text="", $ile=10) {
  2. var_dump($text, $ile);
  3. }
  4. skrot();
wojcup
Jeśli nie podam żadnej wartości to wywala mi:
string(0) ""
ziqzaq
Jeśli ten mój kod wywala ci 'string(0) ""' to coś robisz źle, bo var_dump zrzuca ci coś mało zmiennych wink.gif
wojcup
Dla potomności. Tak wygląda kompletna funkcja:
  1. function skrot($text, $ile){
  2. if(!isset($ile)||$ile=='') {$ile=(int)30;} // dodałem linię sprawdzającą czy $ile nie jest puste, jeśli tak, to przydziela 30
  3. /* var_dump($text, $ile); */
  4. $pos=strrpos(substr((string)$text,0,(int)$ile), ' ');
  5.  
  6. if($pos!==false){
  7. $text=substr($text,0,$pos)." ...";
  8. } else {
  9. $text=substr((string)$text,0,(int)$ile)." ...";
  10. }
  11. return $text;
  12. }


ziqzaq - wywołuję funkcję przez:
  1. echo skrot($text, $ile);


bo kiedy dawałem samo skrot($text, $ile) nic nie wypisywał.
Kiedy spróbowałem Twojej funkcji (oczywiście wcześniej w formularzu nie podawałem nic dla $ile, tylko wpisałem coś dla $text) dla zmiennej $text ładnie wypisał to, co tam podałem ale dla $ile wyskoczyło tylko string(0) "" . Nie wiem, co sprawia, że nie przyjmuje wartości domyślnej.
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.