Verständnisproblem mit Funktion in_array
Bene
- php
Hallo,
warum liefert mir der folgende Code die nachfolgende Ausgabe ....
Code:
if( in_array("abcdefg", array(0,1,2,3)) ) {
echo "abcdefg gefunden";
}
else
{
echo "abcdefg nicht gefunden";
}
Ausgabe:
abcdefg gefunden
Danke und Grüße
Bene
Hello,
ohne das Phänomen selbst gehabt oder überprüft zu haben, tippe ich auf den dritten Parameter. Es könnte am Typunterschied zwischen haystack und needle liegen.
MfG
Rouven
Hallo,
vielen Dank für die Antwort.
Setzte ich den dritten Parameter auf true, so wird der String nicht mehr in der Liste der int-Werte gefunden. Trotzdem ist es mir rätselhaft, warum die Funktion ohne den dritten Parameter true zurückliefert.
Viele Grüße
Bene
Hello,
ohne das Phänomen selbst gehabt oder überprüft zu haben, tippe ich auf den dritten Parameter. Es könnte am Typunterschied zwischen haystack und needle liegen.
MfG
Rouven
vielen Dank für die Antwort.
Setzte ich den dritten Parameter auf true, so wird der String nicht mehr in der Liste der int-Werte gefunden. Trotzdem ist es mir rätselhaft, warum die Funktion ohne den dritten Parameter true zurückliefert.
Ganz einfach - Der Typ der Elemente des Arrays ist Integer, der String wird zum Vergleichen ebenfalls nach Integer umgewandelt. Den Regeln der Konvertierung von String zu Integer gemäß kommt dabei 0 heraus, dieser Wert kommt im Array vor.
Ein weiteres Beispiel dafür, wie verwirrend PHP sein kann.
Hello,
Ein weiteres Beispiel dafür, wie verwirrend PHP sein kann.
PHP wird nur verwirrend, wenn man unvollständigen oder schlampigen Code schreibt und/oder die Notices ausschaltet.
Die "Spezialität" mit '', 0, false usw. muss man allerdings lernen, so wie man in jeder Programmiersprache irgendwelche "Spezialitäten" lernen muss.
Liebe Grüße aus Syburg bei Dortmund
Tom vom Berg
Hallo,
danke für eure Antworten.
Eigentlich war ich mir über diese Eigenheiten von PHP im klaren, in diesem Fall hätte ich aber nicht gedacht, dass überhaupt probiert wird den String in einen Integer umzuwandeln.
Viele Grüße
Bene
Hello,
Ein weiteres Beispiel dafür, wie verwirrend PHP sein kann.
PHP wird nur verwirrend, wenn man unvollständigen oder schlampigen Code schreibt und/oder die Notices ausschaltet.
Die "Spezialität" mit '', 0, false usw. muss man allerdings lernen, so wie man in jeder Programmiersprache irgendwelche "Spezialitäten" lernen muss.
Liebe Grüße aus Syburg bei Dortmund
Tom vom Berg
PHP wird nur verwirrend, wenn man unvollständigen oder schlampigen Code schreibt und/oder die Notices ausschaltet.
Die "Spezialität" mit '', 0, false usw. muss man allerdings lernen, so wie man in jeder Programmiersprache irgendwelche "Spezialitäten" lernen muss.
Dinge, die überraschend sind, sind in einer Programmiersprache immer schlecht. Dass 'abcdefg' in der Menge [0, 1, 2] enthalten sein soll, ist überraschend. Dass in PHP gelten kann, dass a gleich b, b gleich c, aber a ungleich c, ist auch überraschend.
Solche Spezialitäten, die letztlich grober Unfug sind, machen die Sprache so schlecht, wie sie ist.
Hello,
Solche Spezialitäten, die letztlich grober Unfug sind, machen die Sprache so schlecht, wie sie ist.
Ich kann nicht feststellen, dass die Sprache schlecht ist.
Und ich würde mich mit dieser Äußerung auch zurückhalten, bis ich eine bessere erfunden hätte oder aber wenigstens genau die "schlechten Stellen" benennen könnte nebst meiner Vorschläge für bessere Alternativen.
Die automatische Typumwandlung in PHP finde ich auch nicht immer gut, schlimmer finde ich aber die iplizite Deklaration von Variablen. Gäbe es die nicht, würden viele Sicherheitslücken von selber verschwinden. Es wären aber auch solche Dinge wie
while( $_rec = mysql_fetch_assoc($res) )
{
$_table[] = $_rec;
}
nicht möglich, ohne wieder eine Ausnahme zuzulassen.
Man muss also überlegen, an welchen Stellen man ein striktere Handhabung haben will und an welchen sie lästig wäre.
Vielleicht führen die PHP-Entwickler ja einen Schalter "strikt_vars" ein, mit dem die grundsätzliche Deklaration von Variablen (also nicht deren Dimension, sondern "nur" deren Existenz und Grundtyp) zur Pflicht wird. Meisnt Du, dass wir eine genügend fundierte Anforderung dafür formulieren könnten/sollten?
Liebe Grüße aus Syburg bei Dortmund
Tom vom Berg
Ich kann nicht feststellen, dass die Sprache schlecht ist.
Und ich würde mich mit dieser Äußerung auch zurückhalten, bis ich eine bessere erfunden hätte oder aber wenigstens genau die "schlechten Stellen" benennen könnte nebst meiner Vorschläge für bessere Alternativen.
"'abcdefg' ist in [0, 1, 2] enthalten" ist bereits eine solche schlechte Stelle, verursacht durch die implizite Umwandlung. Bene wurde offenkundig völlig überrascht. Das Beispiel "a gleich b, b gleich c, aber a ungleich c", das in PHP möglich ist, habe ich auch schon genannt.
Und ich habe noch eine ganze Reihe anderer Probleme mit PHP:
Die automatische Typumwandlung in PHP finde ich auch nicht immer gut, schlimmer finde ich aber die iplizite Deklaration von Variablen. Gäbe es die nicht, würden viele Sicherheitslücken von selber verschwinden. Es wären aber auch solche Dinge wie
while( $_rec = mysql_fetch_assoc($res) )
{
$_table[] = $_rec;
}
nicht möglich, ohne wieder eine Ausnahme zuzulassen.
array_push($_table, $_rec);
eventuell?
Man muss also überlegen, an welchen Stellen man ein striktere Handhabung haben will und an welchen sie lästig wäre.
Vielleicht führen die PHP-Entwickler ja einen Schalter "strikt_vars" ein, mit dem die grundsätzliche Deklaration von Variablen (also nicht deren Dimension, sondern "nur" deren Existenz und Grundtyp) zur Pflicht wird. Meisnt Du, dass wir eine genügend fundierte Anforderung dafür formulieren könnten/sollten?
register_globals ist der Schalter, der für die Sicherheitslücke verantwortlich ist, standardmäßig ist das seit Version 4.2.0 auf 'aus' (kann aber natürlich aktiviert werden in der entsprechenden Konfigurationsdatei) und ist seit 6.0.0 verschwunden. Undeklarierte Variablen können allerdings weiter genutzt werden, einen Schalter dagegen habe ich nicht gefunden.
Hello,
warum liefert mir der folgende Code die nachfolgende Ausgabe ....
Ausgabe:
abcdefg gefunden
Lass mal die 0 weg im Haystack und erzähöe, wes dann passiert.
Wenn man echo intval("abcdefg") schreibt, was kommt dann?
Liebe Grüße aus Syburg bei Dortmund
Tom vom Berg