Andreas: Fehlende Zahl einer Zahlenreihe ermitteln

Moin!
ich habe ein problem und weiß beim besten Willen nicht mehr weiter:
ich habe in PHP einen Array aus der DB (mysql_fetch_array)
worin lediglich ein Feld der DB ausgelesen, "Zahl".
Jetzt gibt es 10 Zahlen, von 1-10, die jeweils nur einmal - oder gar nicht vorkommen können. z.B. eine Zahlenreihe wie 1,2,3,5,6,9 halt als Array. Jetzt suche ich die erste (oder überhaupt eine) Zahl die Fehlt, also z.B. die 4.
Wie komme ich an diese Zahl???
jemand ne Idee?
Grüße
Andreas

  1. Moin!
    ich habe ein problem und weiß beim besten Willen nicht mehr weiter:
    ich habe in PHP einen Array aus der DB (mysql_fetch_array)
    worin lediglich ein Feld der DB ausgelesen, "Zahl".
    Jetzt gibt es 10 Zahlen, von 1-10, die jeweils nur einmal - oder gar nicht vorkommen können. z.B. eine Zahlenreihe wie 1,2,3,5,6,9 halt als Array. Jetzt suche ich die erste (oder überhaupt eine) Zahl die Fehlt, also z.B. die 4.
    Wie komme ich an diese Zahl???
    jemand ne Idee?

    So, oder?

    $fehlt = 0;
    for ($i = 0; $i < count($array)-1; $i++)
    {
     if ($array[$i] != $array[$i+1] -1)
    {
    $fehlt = $array[i] + 1;
    break;
    }
    }

  2. Yo!

    ich habe in PHP einen Array aus der DB (mysql_fetch_array)
    worin lediglich ein Feld der DB ausgelesen, "Zahl".
    Jetzt gibt es 10 Zahlen, von 1-10, die jeweils nur einmal - oder gar nicht vorkommen können. z.B. eine Zahlenreihe wie 1,2,3,5,6,9 halt als Array. Jetzt suche ich die erste (oder überhaupt eine) Zahl die Fehlt, also z.B. die 4.
    Wie komme ich an diese Zahl???

    Speichere die von der Datenbank empfangenen Zahlen in einem Hash - und zwar als Schlüssel. Als Wert nimmst du einfach die Zahl 1 (PHP kennt wohl keine Bit-Werte, da muß immer wenigstens ein Byte herhalten - alternativ speichere "true").

    Wenn du alle Zahlen gespeichert hast, hast du solch einen Hash:

    $HASH ['1'] = 1
    $HASH ['2'] = 1
    $HASH ['3'] = 1
    $HASH ['5'] = 1
    $HASH ['6'] = 1
    $HASH ['9'] = 1

    Wenn du nun abfragen willst, was die erste nichtgenannte Zahl ist: Einfach bei 1 anfangen zu zählen und gucken, ob im passenden Hash eine 1 drinsteht. In diesem Fall weiterzählen - ansonsten hast du die kleinste unbenutzte Zahl gefunden.

    - Sven Rautenberg

    PS: Es gibt sicherlich noch andere Methoden. ;)

  3. Hallo,

    wenn die Zahlen immer in aufsteigender Reihenfolge ím array ankommen ist es eine einfache Addition...oder du sortierst den array

    nimm das erste feld -->test auf 1
    wenn nein hast du schon die erste

    wenn ja dann ist feld(0) + 1 = feld(1) ?
    also 2

    wenn nein fehlt die zwo

    wenn ja ist die zwo da und es geht weiter im feld(1)
    feld(1) + 1 = feld(2) ?

    u.s.w.u.s.f.

    das ganze noch in eine brauchbare form bringen und eventuelle möglichkeiten, an die ich jetzt nicht gedacht abfangen...

    die fehlenden zahlen kannst wieder in ein array packen...

    Odium

    1. Hi!
      Danke Euch allen für die schnelle Hilfe - Interessante Vorschläge, auf die beiden letzten wäre ich wohl mie gekommen!
      Muß noch überlegen welchen ich am bestenb Einsetze - nochmal vielen Dank!
       -- Grüße Andreas

  4. Huhu Andreas

    in PHP gibt es die Funktion array_diff, damit kann man sicherlich auch eine Lösung bauen.

    http://www.php.net/manual/en/function.array-diff.php

    Viele Grüße

    lulu

    1. Hi!

      in PHP gibt es die Funktion array_diff, damit kann man sicherlich auch eine Lösung bauen.

      http://www.php.net/manual/en/function.array-diff.php

      ... das Leben kann so schön sein - PERFEKT!

      Vielen Dank!

      Grüße
      Andreas

      1. Hi!

        in PHP gibt es die Funktion array_diff, damit kann man sicherlich auch eine Lösung bauen.

        http://www.php.net/manual/en/function.array-diff.php

        ... das Leben kann so schön sein - PERFEKT!

        Vielen Dank!

        Grüße
        Andreas

  5. Hallo,

    Jetzt suche ich die erste (oder überhaupt eine) Zahl die Fehlt, also z.B. die 4.

    Zuerst ist die Frage, ob Du nur wissen willst, ob irgendeine Zahl nicht vorkommt (Variante 1), ob Du wissen willst, welche die erste Zahl ist, die nicht vorkommt (Variante 2), oder ob Du alle Zahlen wissen willst, die nicht vorkommen (Variante 3).

    Das Hash ist sicherlich eine gute Variante, wenn auch meist mit viel Speicherplatzverbrauch verbunden, vor allem, wenn es ein großes Feld wird.

    Wie ist es mit diese Lösung? (bewußt quasi pseudo-code und aus der Hüfte geschossen)

    sollindex = 1;
    while(werte = lese_datensatz)
      {
      istindex = lese_istindex(werte);
    // das nur ein Vorschlag, falls der erste Index kleiner 1 wäre
      if(sollindex > istindex)
        sollindex = istindex;
      while(sollindex < istindex)
        {
        add_to_fehlindex_array(sollindex);
        sollindex = sollindex+1;
        }
      sollindex = sollindex+1;
      }

    Das ergibt in dem fehlindex_array alle fehlenden Indizes.

    sollindex = 1;
    index_fehlt = 0;
    while(werte = lese_datensatz)
      {
      istindex = werte[index];
      if(sollindex > istindex)
        sollindex = istindex;
      if(sollindex < istindex)
        {
         index_fehlt = 1;
         exit_while;
        }
      sollindex = sollindex+1;
      }

    Das erledigt Variante 1 und 2 (wenn fehlt_index 1 ist, dann steht in sollindex der erste fehlende Index.

    Grüße
      Klaus