wie überprüfe ich eine Array ob nur Zahlenwerte drin sind
Norbert
- php
ich habe ein Array, und bevor ich weiter mache, möchte ich überprüfen ob nur Integer Zahlen in diesem enthalten sind.
Hello,
ich habe ein Array, und bevor ich weiter mache, möchte ich überprüfen ob nur Integer Zahlen in diesem enthalten sind.
Über das Array iterieren und jeden Wert auf den gewünschten Typ überprüfen.
foreach() http://de3.php.net/manual/en/control-structures.foreach.php
is_int() http://de3.php.net/manual/en/function.is-int.php
Liebe Grüße aus dem schönen Oberharz
Tom vom Berg
ich habe ein Array, und bevor ich weiter mache, möchte ich überprüfen ob nur Integer Zahlen in diesem enthalten sind.
if ($result === array_filter($deinArray, 'is_int')) ? echo "nur integers" : echo "error";
if ($result === array_filter($deinArray, 'is_int')) ? echo "nur integers" : echo "error";
Was ist denn hierbei $result
? Und was ist das überhaupt für eine Syntax o.O
array_filter($array, 'is_int') liefert ein Array mit allen Integer-Werten zurück, das ist aber noch lange keine Überprüfung ob alles Integer-Zahlen sind.
Des Weiteren bleibt noch die Frage, ob es typsicher sein soll oder ob "2"
auch als Integer durchgehen soll, $_POST
- und $_GET
-Elemente sind schließlich immer vom Typ String.
echo Array(1, 2) === array_filter(Array(1, "2"), 'is_int') ? "fine" : "error";
liefert z.B. error, da is_int("2") === false
.
MfG
bubble
Die Hälfte vergessen und nebenbei ist mir noch ein Denkfehler aufgefallen:
Das Vergessene:
Wie Tom schon sagte, drüber iterieren, sobald ein Element nicht hinhaut kannst du abbrechen.
Der Denkfehler:
Auch 2.5 ist ein Zahlwert, aber noch lange kein Integer, also sollte man wohl eher zu is_numeric greifen (is_numeric("2") === true
, wenn es denn gewünscht ist).
MfG
bubble
Hello,
Die Hälfte vergessen und nebenbei ist mir noch ein Denkfehler aufgefallen:
Das Vergessene:
Wie Tom schon sagte, drüber iterieren, sobald ein Element nicht hinhaut kannst du abbrechen.Der Denkfehler:
Auch 2.5 ist ein Zahlwert, aber noch lange kein Integer, also sollte man wohl eher zu is_numeric greifen (
is_numeric("2") === true
, wenn es denn gewünscht ist).
Auch dieser Gedanke kam mir in den Sinn. Gefragt war aber nur nach Integer.
Liebe Grüße aus dem schönen Oberharz
Tom vom Berg
Hello,
Des Weiteren bleibt noch die Frage, ob es typsicher sein soll oder ob
"2"
auch als Integer durchgehen soll,$_POST
- und$_GET
-Elemente sind schließlich immer vom Typ String.
Das ist allerdings ein berechtigter Einwand, da alle Elemente von $_POST erst einmal vom Typ String sind. Sie müssten dann erst wieder entsprechend der Erwartungshaltung interpretiert werden. Genau zu diesem Zweck wurden die Filter-Funktionen eingeführt
[libk:http://de3.php.net/manual/en/book.filter.php]
Diese untersuchen u. a. die per Request übermittelten Strings darauf, ob sie eine Integer-Repräsentation (oder andere Typen) sein könnten.
Liebe Grüße aus dem schönen Oberharz
Tom vom Berg
http://de3.php.net/manual/en/book.filter.php
Diese untersuchen u. a. die per Request übermittelten Strings darauf, ob sie eine Integer-Repräsentation (oder andere Typen) sein könnten.
Gut zu wissen, dass die existieren, bisher hab ich Zahlen immer per reg. Ausdruck geprüft.
MfG
bubble
Hello,
Diese untersuchen u. a. die per Request übermittelten Strings darauf, ob sie eine Integer-Repräsentation (oder andere Typen) sein könnten.
Gut zu wissen, dass die existieren, bisher hab ich Zahlen immer per reg. Ausdruck geprüft.
So ganz deren Feund bich ich auch noch nicht.
Man muss doch einiges in seinen Strukturen beachten.
Ich habe mir seit der Existenz der Filterfunktionen die Strikte Trennung in $_POST durch die entsprechende Namenvergabe im Formular angewöhnt.
<input name="data[pruefmich]">
Dann kann man durch die Sanitze-Filter nacher einfach alle $_POST['data'] durchjagen, ...
Vielleicht sollte man das noch weiter auf die Spitze treiben.
Liebe Grüße aus dem schönen Oberharz
Tom vom Berg
Hello,
ich habe ein Array, und bevor ich weiter mache, möchte ich überprüfen ob nur Integer Zahlen in diesem enthalten sind.
if ($result === array_filter($deinArray, 'is_int')) ? echo "nur integers" : echo "error";
Das hat ms88 sicherlich so gemeint:
if ($_array === array_filter($_array, 'is_int')) ? echo "nur integers" : echo "error";
Ich habe das aber auch angeschaut, nachdem ich meine generische Lösung gepostet hatte, weil ich nämlich auch noch an die Filter-Funktionen gedacht hatte. Dass es auch direkt bei den Array-Funktionen eine passende gibt, hatte ich nicht sofort im Gedachtnis.
Und ich muss zugeben, dass ich mit dem Hinweis von ms88 weitergekommen wäre, obwohl er nicht vollständig durchgestyled war...
Liebe Grüße aus dem schönen Oberharz
Tom vom Berg
Hi,
Das hat ms88 sicherlich so gemeint:
if ($_array === array_filter($_array, 'is_int')) ? echo "nur integers" : echo "error";
nein, hat er/sie sicher nicht. Denn das ist eine lustige Mischung aus if-Statement und dem ternären Operator (salopp auch Fragezeichen-Operator genannt). In der Kombination ist das ein Syntaxfehler; man sollte sich schon für eine Variante entscheiden.
Und: if-Statement und ternärer Operator sind unter bestimmten Voraussetzungen äquivalent, aber nicht immer.
Ciao,
Martin
Hello Martin,
Das hat ms88 sicherlich so gemeint:
if ($_array === array_filter($_array, 'is_int')) ? echo "nur integers" : echo "error";
nein, hat er/sie sicher nicht. Denn das ist eine lustige Mischung aus if-Statement und dem ternären Operator (salopp auch Fragezeichen-Operator genannt). In der Kombination ist das ein Syntaxfehler; man sollte sich schon für eine Variante entscheiden.
Und: if-Statement und ternärer Operator sind unter bestimmten Voraussetzungen äquivalent, aber nicht immer.
Musst Du wieder meinen ganzen Feierabend stören?
Selbstverständlich hast Du Recht.
Ms88 hat augenscheinlich nur aus der Hüfte geschossen.
echo ($_array === array_filter($_array, 'is_int')) ? echo "nur integers" : echo "error");
Könnte doch aber passen, oder?
Die Einwände von bubble sollten natürlich auch nicht außen vor bleiben. Warum sollte man das arme Programm quälen und das Array mehrfach durchgehen lassen.
Außerdem bleibt es ja meistens auch nicht bei der Prüfung auf einen einzigen Typ, sondern das eine Element soll Integer sein, das andere http (Webadresse per HEAD-Request erreichbar), das nächste ein zumindest logisch richtiger eMail-Name, das nächste soll keine Schimpfworte enthalten, usw. ...
Liebe Grüße aus dem schönen Oberharz
Tom vom Berg
echo ($_array === array_filter($_array, 'is_int')) ? echo "nur integers" : echo "error");
> Könnte doch aber passen, oder?
Da müssen ein oder 2 `echo`{:.language-php}s weg ;p
~~~php
($_array === array_filter($_array, 'is_int')) ? echo "nur integers" : echo "error");
oder
echo ($_array === array_filter($_array, 'is_int')) ? "nur integers" : "error");
SCNR
MfG
bubble
Hello,
Da müssen ein oder 2
echo
s weg ;p
mindestens!
Das war jetzt die Wirkung von
"Müller Thurgau 12%"
besser wäre vermutlich:
echo ($_array === array_filter($_array, 'is_int')?"nur integers":"error");
Liebe Grüße aus dem schönen Oberharz
Tom vom Berg
n'Abend,
Und: if-Statement und ternärer Operator sind unter bestimmten Voraussetzungen äquivalent, aber nicht immer.
Musst Du wieder meinen ganzen Feierabend stören?
'tschuldigung, ich hatte ja nicht geahnt, dass du dich so leicht aus der Ruhe bringen lässt.
Ms88 hat augenscheinlich nur aus der Hüfte geschossen.
Ja. Das passiert mir auch ab und zu, aber selten beim Schreiben.
echo ($_array === array_filter($_array, 'is_int')) ? echo "nur integers" : echo "error");
Könnte doch aber passen, oder?
Das hat bubble schon klargestellt, da halte ich mich jetzt besser zurück. Sonst störe ich deinen Feierabend für morgen womöglich auch noch. ;-)
Ciao,
Martin
Hello,
Das hat bubble schon klargestellt, da halte ich mich jetzt besser zurück. Sonst störe ich deinen Feierabend für morgen womöglich auch noch. ;-)
Prost Martin.
Heute lasse ich mich nicht mehr stören :-)
Liebe Grüße aus dem schönen Oberharz
Tom vom Berg
Hello,
Hello,
Das hat bubble schon klargestellt, da halte ich mich jetzt besser zurück. Sonst störe ich deinen Feierabend für morgen womöglich auch noch. ;-)
Prost Martin.
Heute lasse ich mich nicht mehr stören :-)Liebe Grüße aus dem schönen Oberharz
Tom vom Berg
Liebe Grüße aus dem schönen Oberharz
Tom vom Berg
if ($result === array_filter($deinArray, 'is_int')) ? echo "nur integers" : echo "error";
Das hat ms88 sicherlich so gemeint:
if ($_array === array_filter($_array, 'is_int')) ? echo "nur integers" : echo "error";
Okay, das ergibt natürlich Sinn.
> Ich habe das aber auch angeschaut, nachdem ich meine generische Lösung gepostet hatte, weil ich nämlich auch noch an die Filter-Funktionen gedacht hatte. Dass es auch direkt bei den Array-Funktionen eine passende gibt, hatte ich nicht sofort im Gedachtnis.
`array_filter`{:.language-php} würde ich trotzdem nicht verwenden,
1) muss ein zusätzliches Array erzeugt werden,
2) wird mindestens 2 mal durch das gesamte Array iteriert (1x array\_filter, 1x Vergleich der Arrays)
> Und ich muss zugeben, dass ich mit dem Hinweis von ms88 weitergekommen wäre, obwohl er nicht vollständig durchgestyled war...
Mir ging es nicht um die Code-Auszeichnung, bei mir liefert `if (true) ? bla() : pups();`{:.language-php} einen Syntaxfehler, wobei mir gerade auffällt, dass da ja eigentlich nur das `if`{:.language-php} weg muss.
MfG
bubble
--
If "god" had intended us to drink beer, he would have given us stomachs. - David Daye
ich habe ein Array, und bevor ich weiter mache, möchte ich überprüfen ob nur Integer Zahlen in diesem enthalten sind.
if ($result === array_filter($deinArray, 'is_int')) ? echo "nur integers" : echo "error";
Sry hab das wirklich nur so spontan rausgeschossen eigentlich müsste es eher sowas sein:
if (array_filter($_array, 'is_int')) {
echo "ok";
}
else {
echo "not ok";
}
Das einzeilige if wäre nur wenn man in den return wert was anders speichern wollte, dann müsste das korrekt so lauten
$erg = array_filter($_array, 'is_int') ? "ok" : "nicht ok";
Sry hab das wirklich nur so spontan rausgeschossen eigentlich müsste es eher sowas sein:
if (array_filter($_array, 'is_int')) {
echo "ok";
}
else {
echo "not ok";
}
>
> Das einzeilige if wäre nur wenn man in den return wert was anders speichern wollte, dann müsste das korrekt so lauten
>
> `$erg = array_filter($_array, 'is_int') ? "ok" : "nicht ok";`{:.language-php}
Guck dir noch mal array\_filter an. Bei array\_filter(Array(1, "x"), 'is\_int') würde $erg "ok" beinhalten, da array\_filter array(1) ausspucken würde.
MfG
bubble
--
If "god" had intended us to drink beer, he would have given us stomachs. - David Daye
$erg = array_filter($_array, 'is_int') ? "ok" : "nicht ok";
Guck dir noch mal array_filter an. Bei array_filter(Array(1, "x"), 'is_int') würde $erg "ok" beinhalten, da array_filter array(1) ausspucken würde.MfG
bubble
stimmt sorry.
Eventuell in die Richtung:
function check($value)
{
return is_int($value) ? 1 : 0;
}
$a = array(1, 2, 3, 4, 5);
$b = array_map("check", $a);
if (array_sum($b) == count($a)) {
echo "ok";
}
denke dann kann mans aber auch gleich mit foreach machen und rechtzeitig abbrechen, ist wahrscheinlich effizienter.
Eventuell in die Richtung:
function check($value)
{
return is_int($value) ? 1 : 0;
}$a = array(1, 2, 3, 4, 5);
$b = array_map("check", $a);
if (array_sum($b) == count($a)) {
echo "ok";
}
> denke dann kann mans aber auch gleich mit foreach machen und rechtzeitig abbrechen, ist wahrscheinlich effizienter.
Es wird wahrscheinlich darauf hinaus laufen.
~~~php
echo (count($_array) == count(array_filter($_array, 'is_int'))) ? "ja" : "nö";
Dürfte mit den array_*-Funktionen am schnellsten sein, 1x iterieren + 1x neues Array.
MfG
bubble
Hello Norbert,
bist Du noch da?
Oder haben wir dich mit unserer Diskussion etwa verschreckt?
Das wäre dann aber schade :-)
Prost!
Liebe Grüße aus dem schönen Oberharz
Tom vom Berg
bist Du noch da?
Oder haben wir dich mit unserer Diskussion etwa verschreckt?
Das wäre dann aber schade :-)
Prost!
Womöglich auch nur auf 'nen paar Bier mit Freunden unterwegs :D
*Bier aufkork* Prost!
MfG
bubble
Tach!
ich habe ein Array, und bevor ich weiter mache, möchte ich überprüfen ob nur Integer Zahlen in diesem enthalten sind.
Wenn es funktional sein darf, dann array_reduce(). Der $initial-Wert sollte true sein und als Parameter $callback käme solch eine Funktion zum Einsatz (als anonyme Funktion zum Direktverwenden):
function ($carry, $item) {
return $carry && prüfung_auf_integer($item);
}
Wenn bereits ein Nicht-Integer-Wert festgestellt wurde, werden wegen des Kurzschlussverfahrens keine weiteren Tests mehr ausgeführt, aber die Iteration läuft noch bis zum Array-Ende durch.
Wie prüfung_auf_integer() auszusehen hat, kommt auf die Definition von Integer-Zahl in diesem Fall an. Handelt es sich um Variablen vom Typ integer, dann is_int(). Können die Werte auch Zahlen in Strings sein, dann muss man eine andere geeignete Prüfung nehmen. Zu beachten ist außerdem, dass die Funktion bei 0 nicht 0 oder was anderes zu false kompatibles liefern darf.
dedlfix.