auf "nur" Zahlen im Array prüfen

Registrierer

Erfahrenes Mitglied
Ich möchte prüfen, ob in einem Array nur Zahlen als Werte vorkommen und hab mir mal folgende Funktion gebaut:
PHP:
function nurzahlenimarray($nummer)  {
  $nummer1 = false;
  if (isset($nummer)) {
    foreach($nummer as $nummer1) {
      if (preg_match("/\d/",$nummer1))
        return $nummer1 = true;
    }
  }
}

Ich bin sicher das geht eleganter, oder?
 
Schwer zu sagen. Es hängt sehr davon ab, was in dem Array alles enthalten sein kann und was du genau als „Zahl“ durchgehen lassen würdest. Strings, Floats, Integers, null? Strings mit leading/trailing Whitespace? Hexadezimale/oktale Angaben? Kommazahlen? Wissenschaftliche Notation? Negative Zahlen? Negative Zahlen in Strings?

Dein regulärer Ausdruck prüft nur, ob eine „Zahl“ irgendwo im String vorkommt. \d ist mitunter locale-abhängig. Ich *glaube*, es sind Szenarien denkbar, in denen \d auch ³ oder so als Zahl erkennen würde. Mit [0-9] bist du auf der sicheren Seite.

Bei so Fitzelkrams ist es immer schwierig, genau zu definieren, was man will.
 
Schwer zu sagen. Es hängt sehr davon ab, was in dem Array alles enthalten sein kann und was du genau als „Zahl“ durchgehen lassen würdest. Strings, Floats, Integers, null? Strings mit leading/trailing Whitespace? Hexadezimale/oktale Angaben? Kommazahlen? Wissenschaftliche Notation? Negative Zahlen? Negative Zahlen in Strings?
Is ja guuut :)

Ich will nur auf Ganzzahlen püfen (int), da hier die ID aus einer DB abgefragt wird.

Dein regulärer Ausdruck prüft nur, ob eine „Zahl“ irgendwo im String vorkommt. \d ist mitunter locale-abhängig. Ich *glaube*, es sind Szenarien denkbar, in denen \d auch ³ oder so als Zahl erkennen würde. Mit [0-9] bist du auf der sicheren Seite.

Sicher, hab \^[0-9]+$\ draus gemacht, damit nur Ziffern erlaubt werden.
Regex bezeichnet die Zeichenklasse "d" für Digit als gleichwertig zu [0-9]. So jedenfalls z. B. hier in der Doku.

Leider gibt meine Funktion schon bei nur einem Treffer im Array schon "true", es dürfen aber in allen Einträgen "nur" Ziffern vorkommen.
PHP:
function nurzahlenimarray($nummer)  {
  $nummer1 = false;
  if (isset($nummer)) {
    foreach($nummer as $nummer1) {
      if (preg_match('/^[0-9]+$/',$nummer1))
        return $nummer1 = true;
    }
  }
}
Was müsste ich ändern?
 
Hallo,

man könnte auch ein Datenfilter verwenden:
PHP:
$array = array(5, 3, 'pi100' => 3.14*100, 'child' => array('0815', 27000), 4711); 

$arrIterator = new RecursiveArrayIterator($array); 
$itIterator = new RecursiveIteratorIterator($arrIterator);

$countInt = $countOther = 0;
foreach ($itIterator as $value)
{
	if(filter_var($value, FILTER_VALIDATE_INT)) $countInt++;
	else $countOther++;
}
echo 'Anzahl der INT-Werte: ', $countInt, ',<br>';
echo 'Werte insgesamt: ', $countInt + $countOther, '.';

Ausgabe:
Code:
Anzahl der INT-Werte: 5,
Werte insgesamt: 6.
 
Zuletzt bearbeitet:
Bin doch bei preg_grep geblieben, aber nur weil es für mich einfacher war dies in eine Funktion zu packen ;-)
PHP:
function nur_int_im_array($nummer)  {
  if (isset($nummer)) {
    $nummer1  = count ($nummer);
    $nummer   = count (preg_grep("@^[0-9]+$@", $nummer));
    if ($nummer === $nummer1)
      return $nummer = true;
    else
      return $nummer = false;
  }
}
 

Sorry, man sollte da schon exakt sein. :D

Ich will nur auf Ganzzahlen püfen (int), da hier die ID aus einer DB abgefragt wird.

Wenn du damit den Datentyp Integer meinst, kannst du is_int verwenden.

- http://de3.php.net/manual/en/function.is-int.php

Ich würde aber zusätzlich noch auf > 0 prüfen, wenn das IDs sind.

Du meinst nicht den Datentyp Integer, oder? Apropos exakt. :)

Sicher, hab \^[0-9]+$\ draus gemacht, damit nur Ziffern erlaubt werden.
Regex bezeichnet die Zeichenklasse "d" für Digit als gleichwertig zu [0-9]. So jedenfalls z. B. hier in der Doku.

Ja, ich weiß wohl. Bei Interesse hier ab Post #9:

- http://www.php.de/php-fortgeschritt...dieses-muster-oder-gar-nichts.html#post755471

Wenn du mich fragst, ist das ein ziemliches „F… you“ gegenüber Anwendern von regulären Ausdrücken. Deshalb erwähne ich es.

Etwa bei \w ist das übrigens derselbe Mist. Das ist auch nicht [0-9A-Z_a-z].

Da ist es immerhin dokumentiert:

A "word" character is any letter or digit or the underscore character, that is, any character which can be part of a Perl "word". The definition of letters and digits is controlled by PCRE's character tables, and may vary if locale-specific matching is taking place. For example, in the "fr" (French) locale, some character codes greater than 128 are used for accented letters, and these are matched by \w.

- http://de2.php.net/manual/en/regexp.reference.escape.php

Wo wir das Thema gerade haben: ^[0-9]+$ matcht auch Eingaben wie "123\n", die mit einem "\n" enden.

assert end of subject or before a terminating newline (or end of line, in multiline mode)

- http://de2.php.net/manual/en/regexp.reference.meta.php

Ich denke, \z schafft Abhilfe.

- http://de2.php.net/manual/en/regexp.reference.escape.php

Ungetestet:

PHP:
return (count(preg_grep("@^[1-9][0-9]*\z@", $nummer, PREG_GREP_INVERT)) === 0);

Das jetzt aber nur mal als „weiterführende“ Idee. Ich erhebe nicht den Anspruch, dass das die beste Lösung ist.

Eine Schleife, die sofort beim ersten Fehler abbricht, wäre wahrscheinlich effizienter. Darauf wird es aber sicherlich an der Stelle überhaupt nicht ankommen.
 
Zurück