php stripos rückgabe auswerten

sir.hacks.alot

sir.hacks.alot

Aktives Mitglied
Thread Starter
Dabei seit
10.03.2005
Beiträge
2.408
Reaktionspunkte
115
Ich habe folgendes Problem, ich will aus einer Liste mit Kundennamen die ersten drei Buchstaben abschneiden wenn die fa. oder Fa. sind also verwende ich die Funktion
PHP:
 $pos=stripos($Name,'fa.')
. Wenn ich mir eine Liste am ausgeben lasse in der ich jedem Kunden die Position von fa zuordne sehe ich das alles korrekt arbeitet. Bei Kunden wo nichts steht steht auch keine Zahl bei kunden wo das fa auftaucht steht eine null. Leider funktioniert die Abfrage
PHP:
if($pos===0)
nicht korrekt, sie liefert auch true, wenn statt einer null nichts in der Variable ist. Wie werte ich nun die Rückgabe von stripos so aus, daß ich den Unterschied zwischen FALSE und 0 erkennen kann?
 
auf false/true kannst du mit if($pos) testen...

ist das oben eigentlich ein tippfehler mit den 3 gleich-zeichen?
vergleiche haben nur 2...
 
=== ist auch möglich, ist glaub ich, wenn es haargenau stimmen soll... auch der Datentyp

also wenn z.b.

$var = "1";

und du überprüfst:

if($var == 1)

wird es TRUE geben aber

if($var === 1)

wird es FALSE geben, da nicht auf einen String überprüft wird.



und zu dem ursrpünglichen Problem:

wenn du es mit

if($pos != false)

oder eben nur mit 2 = machst

if($pos == 0)

klappts dann vielleicht?
 
nein mit == gehts leider nicht, das war mein erster ansatz, habe aber an diversenstellen die empfehlung gelesen mit === zu vergleichen.
 
habe dann noch einweig rumgespielt mit:
PHP:
if(is_int($pos)&&$pos==0)
geht es merkwürdigerweise. Es scheint so als würde bei mir der Operator === nicht funktionieren, denn der sollte einen Typunterschied zwischen 0 und FALSE bemerken. Ich habe das ganze jetzt unter MAMP auf meinem Macbook getestet, da ging der vergleich mit === einwandfrei, der mit == schlug wie erwartet fehl. Meine andere Testumgebung für die Applikation ist xampp in der neuesten Version auf Ubuntu Edgy Eft und da läufts halt nicht. Ich bin echt ratlos, aber mein "Workaround tuts ja". Wenn jemand Abhilfe wüsste wäre ich natürlich sehr dankbar.

Edit:

Jetzt wirds richtig merkwürdig
PHP:
if($pos===(int)0)
tuts. Hatte halt gedacht, daß die 0 vielleicht fälschlicherweise als anderer Datentyp als Int behandelt wird, aber:
PHP:
echo var_dump(0);
echo gettype(0);
gibt int(0)integer zurück. Jetzt frage ich mich doch ernsthaft wo der Unterschied zwischen ===(int)0 und ===0 besteht
 
Zuletzt bearbeitet:
Lt. PHP-Referenz zu strpos

Code:
Returns the numeric position of the first occurrence of needle in the 
haystack string. Unlike the strrpos() before PHP 5, this function can take a full
string as the needle parameter and the entire string will be used.

[B]If needle is not found, strpos() will return boolean FALSE.[/B]

Ergo musst du auf false überprüfen, wenn du wissen willst, ob 'fa.' nicht vorgekommen ist.

Der === Operator nennt sich 'Identical' und retourniert true wenn $a <-> $b UND vom gleichen Datentyp sind.
 
ja ich weiss, das ist ja auch garnicht das problem. Das Problem ist, daß man bei der Abfrage mit===0 eigentlich den fall false und 0 unterscheiden können müsste, da FALSE boolean ist 0 aber int(Was ja auch von stipos zurückgegeben wird wenn nicht false). Die if-Abfrage müsste also bei einem FALSE abweisen und bei einer 0 reinlassen. Das Problem ist, daß die Abfrage bei false und 0 abweist da er die 0 nicht als int anerkennt, obwohl sie es ist. Aber nur auf meinem Linuxrechner, auf dem Mac macht die if-Abfrage ja genau was sie soll. Nur über false kann ich meine Abfrage ja nicht realisieren, da ja eigentlich nur der Fall 0 interessant ist. Nicht False bedeutet aber das fa. an jeder Position stehen könnte.

Aber was solls, ich habe das Problem ja in den Griff bekommen.
 
Zuletzt bearbeitet:
also ich mach das immer folgendermaßen:
PHP:
if (($pos = stripos($zeichenkette, 'suchtext')) !== false) {
    echo "Zeichenkette an Stelle ".$pos." gefunden\n";
} else {
    echo "Zeichenkette leider nicht gefunden\n";
}

== bzw. != vergleicht auf "Ähnlichkeit"
=== bzw. !== vergleicht auf Gleichheit, also zum Beispiel:

PHP:
// richtig
0 == false
// falsch, weil nicht Typengleich
0 === false


$str1 = "a";
$str2 = "a";
// richtig
$str1 == $str2
// falsch, weil nicht gleicher "Pointer"
$str1 === $str2
 
Zuletzt bearbeitet:
...nebenbei bemerkt fängt der Pfusch doch schon viel früher an: beim Reinschreiben der Anrede in das Namensfeld.
Das sollten doch nun wirklich getrennte Felder sein, und natürlich sollten die Anreden in einer eigenen Tabelle im Klartext stehen und per UID verknüpft werden.
 
Ja schon, aber da habe ich keinen Einfluss drauf.
 
warum machst du nicht einfach ein:
PHP:
$name = preg_replace("/[fa |fa\. ](.*)/i", "$1", $name);
wobei $name dein Feldname mit dem zu überprüfenden fa oder fa. drin ist.
Die Funktion ist nicht getestet, kann also nicht exakt sagen ob e so geht. Ist also mehr als Anregung gedacht.
Hat übrigens auch den Vorteil, dass das unter PHP4 funktioniert. Soweit ich mich erinner sind die "i-String-Funktionen", also die welche Groß- und Klein-Schreibung erschlagen, erst seit PHP5 mit an Bord.
 
Zurück
Oben Unten