Problem mit intval()
Hallo,
ich habe ein Stück Code, dessen Ergebnis ich nicht nachvollziehen kann.
<?php
$value = '1A';
$gleich = ($value == intval($value));
printf( '"%s" - "%s" - "%s"',$value,intval($value),$gleich);
?>
Die Ausgabe bei mir (5.0.5-Debian-0.8~sarge1) ist:
"1A" - "1" - "1"
D.h. es wird auf _GLEICHHEIT_ erkannt, wie kann denn das sein?!
Es könnte sein, dass das "==" den Typ von $value (links) ändert und
dabei auf den selben Wert kommt, aber wie mache ich den Vergleich dann?
strval($value) hilft nicht.
Kann das jemand reproduzieren / erklären?
Hintergrund ist, $value auf integer zu prüfen, wobei $value als string
ankommt, is_int() also nicht geht und preg_match('~^\d+$~',$value)
vielleicht etwas "oversized" ist.
Regards,
Knut
--
Newsoffice.de - Die Onlinesoftware zum Lesen und Schreiben im Usenet
Re: Problem mit intval()
Knut Kohl schrieb:
> D.h. es wird auf _GLEICHHEIT_ erkannt, wie kann denn das sein?!
>
> Es könnte sein, dass das "==" den Typ von $value (links) ändert und
> dabei auf den selben Wert kommt, aber wie mache ich den Vergleich dann?
> strval($value) hilft nicht.
Bei "==" wird nur der Wert auch Gleichheit geprüft, unterschiedliche
Typen werden dabei ignoriert und das int wird zu einem string gecastet
für den Vergleich und da ist nunmal "1" dann auch gleich "1".
Versuche das gleiche Beispiel einfach mal mit "===". Das überprüft dann
auch den Datentyp mit, daher dein int 1 ist dann ungleich dem string "1".
--
Mit freundlichen Grüßen,
Christoph Herrmann
http://dragonprojects.de/
Re: Problem mit intval()
Knut Kohl schrieb:
> Es könnte sein, dass das "==" den Typ von $value (links) ändert und
> dabei auf den selben Wert kommt
Es könnte auch sein, dass du den Typ explizit mit intval() castest. Was
erwartest du denn was da passieren soll?
Gruß,
Habbo
Re: Problem mit intval()
Knut Kohl schrieb:
>$value = '1A';
>$gleich = ($value == intval($value));
Willkommen in der wunderbaren Welt von PHP-Typecasting :-)
Alles wohldefiniertes Verhalten:
http://de.php.net/manual/de/language.types.type-juggling.php
Wie Christoph schon sagte: Du suchst den Operator "===".
--
Wolfgang Fellger
Re: Problem mit intval()
Hallo Christoph,
Christoph Herrmann schrieb am 12. Sep 2007 in de.comp.lang.php.misc:
> Knut Kohl schrieb:
>> D.h. es wird auf _GLEICHHEIT_ erkannt, wie kann denn das sein?!
>>
>> Es könnte sein, dass das "==" den Typ von $value (links) ändert und
>> dabei auf den selben Wert kommt, aber wie mache ich den Vergleich dann?
>> strval($value) hilft nicht.
> Bei "==" wird nur der Wert auch Gleichheit geprüft, unterschiedliche
> Typen werden dabei ignoriert und das int wird zu einem string gecastet
> für den Vergleich und da ist nunmal "1" dann auch gleich "1".
Na ja, aber:
<?php
$val = '1A'; # eindeutig string
$int = intval($val); # eindeutig int
var_dump($val);
echo '<br>';
var_dump($int);
echo '<br>';
echo ($val == $int) ? 'gleich' : 'ungleich';
echo '<br><br>';
$val = 'A1'; # eindeutig string
$int = intval($val); # eindeutig int
var_dump($val);
echo '<br>';
var_dump($int);
echo '<br>';
echo ($int == $val) ? 'gleich' : 'ungleich';
?>
ergibt bei mir (das 2. ist besonders nett):
string(2) "1A"
int(1)
gleich
string(2) "A1"
int(0)
gleich
Sieht hier eher so aus, als ob auf _INTEGER_ gecastet wird?!
> Versuche das gleiche Beispiel einfach mal mit "===". Das überprüft dann
> auch den Datentyp mit, daher dein int 1 ist dann ungleich dem string
> "1".
Ich will ja aber rausfinden, ob der angelieferte string einen integer
enthält!
Mit preg_match ginge es auch, aber warum das hier nicht klappt, möchte
ich verstehen!
Regards,
Knut
--
Newsoffice.de - Die Onlinesoftware zum Lesen und Schreiben im Usenet
Re: Problem mit intval()
Wolfgang Fellger schrieb am 12. Sep 2007 in de.comp.lang.php.misc:
> Knut Kohl schrieb:
>> $value = '1A';
>> $gleich = ($value == intval($value));
> Willkommen in der wunderbaren Welt von PHP-Typecasting :-)
Schon klar, aber warum wird offensichtlich nach integer gecastet und
nicht nach string?
> Alles wohldefiniertes Verhalten:
> http://de.php.net/manual/de/language.types.type-juggling.php
> Wie Christoph schon sagte: Du suchst den Operator "===".
Eben nicht, weil '1' === intval('1') ist FALSE!
Ich will nun mal wissen, ob der gelieferte String einen Integer enthält.
Regards,
Knut
--
Newsoffice.de - Die Onlinesoftware zum Lesen und Schreiben im Usenet
Re: Problem mit intval()
Knut Kohl schrieb:
>Ich will nun mal wissen, ob der gelieferte String einen Integer enthält.
$x === strval(intval($x))
--
Wolfgang Fellger
Re: Problem mit intval()
Knut Kohl schrieb:
> Ich will nun mal wissen, ob der gelieferte String einen Integer enthält.
Wenn im String NUR ein Integer ist, kannst casten. Aber bei dir ist es
wohl eher ein Gemisch aus Ziffern und Buchstaben. Wüsste ich nur Regex
als Möglichkeit.
--
Mit freundlichen Grüßen,
Christoph Herrmann
http://dragonprojects.de/
Re: Problem mit intval()
Knut Kohl schrieb:
> $value = '1A';
>
> Hintergrund ist, $value auf integer zu prüfen, wobei $value als string
> ankommt, is_int() also nicht geht und preg_match('~^\d+$~',$value)
> vielleicht etwas "oversized" ist.
nur mal nebenbei, dann ist das hier ein Negativbeispiel? Denn "1A" ist ja
kein Integer.
> $gleich = ($value == intval($value));
ansonten würde ich diese Zeile einfach so schreiben:
| $gleich = ($value === strval(intval($value)));
| var_dump($gleich);
ergibt bei "1A" und "A" dann false und bei "1" true.
Gruß
Carsten
Re: Problem mit intval()
..oO(Knut Kohl)
>ich habe ein Stück Code, dessen Ergebnis ich nicht nachvollziehen kann.
>
><?php
>
>$value = '1A';
>
>$gleich = ($value == intval($value));
>
>printf( '"%s" - "%s" - "%s"',$value,intval($value),$gleich);
>
>?>
>
>Die Ausgabe bei mir (5.0.5-Debian-0.8~sarge1) ist:
>
>"1A" - "1" - "1"
>
>D.h. es wird auf _GLEICHHEIT_ erkannt, wie kann denn das sein?!
Dein String wird nach Integer gecastet. Das geht soweit gut, wie Zahlen
am Anfang des Strings stehen und führt zu "1". Der Rest, also "A", wird
dann ignoriert.
>Es könnte sein, dass das "==" den Typ von $value (links) ändert und
>dabei auf den selben Wert kommt, aber wie mache ich den Vergleich dann?
>strval($value) hilft nicht.
>
>Kann das jemand reproduzieren / erklären?
>
>Hintergrund ist, $value auf integer zu prüfen, wobei $value als string
>ankommt, is_int() also nicht geht und preg_match('~^\d+$~',$value)
>vielleicht etwas "oversized" ist.
Es gibt noch is_numeric().
Micha
Re: Problem mit intval()
Knut Kohl meinte:
> Hallo Christoph,
>
> Christoph Herrmann schrieb am 12. Sep 2007 in de.comp.lang.php.misc:
>
>> Knut Kohl schrieb:
>>> D.h. es wird auf _GLEICHHEIT_ erkannt, wie kann denn das sein?!
>>>
>>> Es könnte sein, dass das "==" den Typ von $value (links) ändert und
>>> dabei auf den selben Wert kommt, aber wie mache ich den Vergleich dann?
>>> strval($value) hilft nicht.
>
>> Bei "==" wird nur der Wert auch Gleichheit geprüft, unterschiedliche
>> Typen werden dabei ignoriert und das int wird zu einem string gecastet
>> für den Vergleich und da ist nunmal "1" dann auch gleich "1".
>
> Na ja, aber:
>
> <?php
>
> $val = '1A'; # eindeutig string
> $int = intval($val); # eindeutig int
[snip]
> echo ($int == $val) ? 'gleich' : 'ungleich';
> ergibt bei mir (das 2. ist besonders nett):
> gleich
Passt doch einwandfrei. Einmal wandelst du explizit nach int (=1), das
andere mal macht es PHP automatisch, weil "==", also auch wieder 1. Und
1=1 und das ist gleich. Was Christoph schon erläutert hat.
Gregor
--
http://www.gregorkofler.at ::: Landschafts- und Reisefotografie
http://www.licht-blick.at ::: Forum für Multivisionsvorträge
http://www.image2d.com ::: Bildagentur für den alpinen Raum
Re: Problem mit intval()
Knut Kohl schrieb:
> Ich will ja aber rausfinden, ob der angelieferte string einen integer
> enthält!
Dan prüfe das auch. Und nicht irgend etwas anderes.
http://de2.php.net/manual/en/function.is-int.php
> aber warum das hier nicht klappt, möchte
> ich verstehen!
Steht alles im Manual: http://www.php.net/manual/en/types.comparisons.php=
MfG
Niels
--
| http://www.kolleg.de =B7 Das Portal der Kollegs in Deutschland |
| http://www.bsds.de =B7 BSDS Braczek Software- und DatenSysteme |
| Webdesign =B7 Webhosting =B7 e-Commerce =B7 Joomla! Content Management =
|
------------------------------------------------------------ ------
Re: Problem mit intval()
Niels Braczek schrieb:
>> Ich will ja aber rausfinden, ob der angelieferte string einen integer
>> enthält!
>http://de2.php.net/manual/en/function.is-int.php
Wer sind Sie, und was haben Sie mit Niels gemacht?
is_int('42') === false
is_numeric ginge, erlaubt aber mehr Varianten. Das ist evtl. ungewünscht.
ctype_digit() wäre noch am ehesten die Antwort, aber auch da kann es sein,
dass die Zahl zu lang für einen int ist.
--
Wolfgang Fellger
Re: Problem mit intval()
Christoph Herrmann schrieb:
> Knut Kohl schrieb:
>
>> D.h. es wird auf _GLEICHHEIT_ erkannt, wie kann denn das sein?!
>
> Bei "==" wird nur der Wert auch Gleichheit geprüft, unterschiedliche
> Typen werden dabei ignoriert und das int wird zu einem string gecastet
> für den Vergleich und da ist nunmal "1" dann auch gleich "1".
Wenn dem so wäre, müsste "1" mit "1A" verglichen werden, und das wäre
ungleich. Dem ist aber mitnichten so.
Vielmehr wird der String "1A" in einen int mit dem Wert 1 gewandelt
(nicht gecastet) und dann die beiden int-Werte verglichen (Quelle:
<http://www.php.net/manual/en/language.operators.comparison.php>).
Gruß. Claus
Re: Problem mit intval()
Wolfgang Fellger schrieb:
> Niels Braczek schrieb:
>
>>> Ich will ja aber rausfinden, ob der angelieferte string einen integer=
>>> enthält!
>>http://de2.php.net/manual/en/function.is-int.php
>
> Wer sind Sie, und was haben Sie mit Niels gemacht?
> is_int('42') =3D=3D=3D false
Der musste einer Hyperraum-Umgehungsstraße weichen ;-)
Ich hatte fälschlicherweise is_int() dasselbe Grundverhalten wie
is_numeric() unterstellt. Sorry.
> is_numeric ginge, erlaubt aber mehr Varianten. Das ist evtl. ungewüns=
cht.
if ( is_numeric( $var ) && $var =3D=3D intval( $var ) ) {...}
MfG
Niels
--
| http://www.kolleg.de =B7 Das Portal der Kollegs in Deutschland |
| http://www.bsds.de =B7 BSDS Braczek Software- und DatenSysteme |
| Webdesign =B7 Webhosting =B7 e-Commerce =B7 Joomla! Content Management =
|
------------------------------------------------------------ ------