Klaus: Schleifen oder Array Problem

Hallo!

Ich hoffe hier wird mir geholfen?

Ich habe mir ein Array gebaut. In dem ersten Array steht die Bestandsnummer und in dem zweiten Array stehen die aktiven Nummern.

Nun möchte ich die beiden Strings in ein 2 Dimensionales Array schreiben. Wenn zwei Nummern identisch sind soll im jeweiligen Array das 2. Feld auf aktiv = 1 gesetzt werden ansonsten 0.

Nur irgendwie funktioniert das bei mir nicht, entweder setzt er das erste oder letzte Element vom aktiv Array auf 1 aber alle anderen Felder werden mit 0 gesetzt.

Hier mein Test Code:

$bestand = array();
$aktiv   = array();

$bestand  = "101111;102111;103111;104111;105111;106111;107111;108111;109111;110111";
$aktiv   = "101111;103111;104111;105111;108111;109111";

$array_bestand = array();
$array_aktiv = array();

$array_bestand = explode(';', $bestand);
$array_aktiv   = explode(';', $aktiv);

$anzahl_bestand =  count ($array_bestand);
$anzahl_aktiv =  count ($array_aktiv);

for ($i=0; $i <$anzahl_bestand; $i++)
{
  $array_liste[$i][0]= $array_bestand[$i];

for ($y=0; $y <$anzahl_aktiv; $y++)
  {
   if ($array_bestand[$i] == $array_aktiv[$y])
    {
    $array_liste[$i][1]= 1;
    }
   else
    {
    $array_liste[$i][1]= 0;
    }
  }
}

echo "<pre>";
 print_r($array_liste);
 echo "</pre><br>";

Ausgabe:

Array
(
    [0] => Array
        (
            [0] => 101111
            [1] => 0
        )

[1] => Array
        (
            [0] => 102111
            [1] => 0
        )

[2] => Array
        (
            [0] => 103111
            [1] => 0
        )

[3] => Array
        (
            [0] => 104111
            [1] => 0
        )

[...]

[8] => Array
        (
            [0] => 109111
            [1] => 1
        )

[9] => Array
        (
            [0] => 110111
            [1] => 0
        )

)

Normal müßte PHP Array 2 das 2 Element auf 1 setzen! Aber PHP macht das irgendwie falsch?

Was habe ich denn da falsch gemacht?

Gruß Klaus

  1. Huhu Klaus

    Nur irgendwie funktioniert das bei mir nicht, entweder setzt er das erste oder letzte Element vom aktiv Array auf 1 aber alle anderen Felder werden mit 0 gesetzt.

    $bestand = array();
    $aktiv   = array();

    $bestand  = "101111;102111;103111;104111;105111;106111;107111;108111;109111;110111";
    $aktiv   = "101111;103111;104111;105111;108111;109111";

    $array_bestand = array();
    $array_aktiv = array();

    $array_bestand = explode(';', $bestand);
    $array_aktiv   = explode(';', $aktiv);

    $anzahl_bestand =  count ($array_bestand);
    $anzahl_aktiv =  count ($array_aktiv);

    for ($i=0; $i <$anzahl_bestand; $i++)
    {
      $array_liste[$i][0]= $array_bestand[$i];

    for ($y=0; $y <$anzahl_aktiv; $y++)
      {

    if ($array_bestand[$i] == $array_aktiv[$y])
        {
        $array_liste[$i][1]= 1;
        }
       else
        {
        $array_liste[$i][1]= 0;
        }

    }
    }

    Was habe ich denn da falsch gemacht?

    Da steckt folgender logischer Fehler drin.
    Die For-Schleife welche über $y läuft, geht immer
    _alle_ Elemente des $array_bestand durch und
    setzt jeweils $array_liste[$i][1] auf 0 oder 1.

    Als Ergebnis erhältst Du immer das Ergebnis des _letzten_ Durchganges.

    Ein Lösung könnte folgendes sein

    // default 0 setzen
    $array_liste[$i][1]= 0;

    for ($y=0; $y <$anzahl_aktiv; $y++)
    {
     if ($array_bestand[$i] == $array_aktiv[$y])
     {
     $array_liste[$i][1]= 1;
       // wenn gefunden diese for-Schleife beenden
     break;
     }

    }

    Wenn ich Deine Aufgabe-/Problemstellung richtig verstanden habe
    könnte Dir die PHP-Funktion array_diff einiges an Arbeit abnehmen ;-)

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

    Viele Grüße

    lulu

    --
    bythewaythewebsuxgoofflineandenjoytheday
    1. Mit array_diff kann ich leider nichts anfangen ich brauche eine 2 Dimensionales Array da ich anschliessend da später angezeigt werden soll welche Nummer aktiv ist und welche inaktiv.

      Mit Break habe ich es zuvor auch schon ausprobiert aber daran liegte es auch nicht!

      for ($i=0; $i <$anzahl_bestand; $i++)
        {
        echo $array_bestand[$i]."<br>";
        $array_liste[$i][0]= $array_bestand[$i];

      for ($y=0; $y <$anzahl_aktiv; $y++)
        {
         if ($array_bestand[$i] == $array_aktiv[$y])
          {
          $array_liste[$i][1]= 1;
          break;
          }
         else
          {
          $array_liste[$i][1]= 0;
          break;
          }
        }
      }

      Ich versteh es nicht wirklich warum nur der letzte Wert richtig ist. Ich habe mir das schon aufgemalt normal müßte es funktionieren aber die Ausgabe ist falsch!

  2. Hallo Klaus,

    Nur irgendwie funktioniert das bei mir nicht, entweder setzt er das erste oder letzte Element vom aktiv Array auf 1 aber alle anderen Felder werden mit 0 gesetzt.

    du durchläufst das ganze Array $array_aktiv - auch wenn die aktuelle Nummer aus $array_bestand gefunden wurde, und deswegen wird $array_liste[$i][1] immer auf 0 gesetzt (außer die aktuelle Nummer ist die letzte im Array $array_aktiv). Du müsstest also die for-Schleife mit break abbrechen.

    $bestand = array();
    $aktiv   = array();

    für was ist das? - zwei Zeilen weiter unten werden den Variablen doch Strings zugewiesen.

    $bestand  = "101111;102111;103111;104111;105111;106111;107111;108111;109111;110111";
    $aktiv   = "101111;103111;104111;105111;108111;109111";

    $array_bestand = array();
    $array_aktiv = array();
    $array_bestand = explode(';', $bestand);
    $array_aktiv   = explode(';', $aktiv);

    mit der Funktion in_array() (->http://de3.php.net/in_array) und dem Trinitäts-Operator (->http://de3.php.net/language.operators.comparison) tust du dir hier leichter (ungetestet):
     $array_liste = array();
     foreach($array_bestand as $best){
       $element_aktiv = in_array($best,$array_aktiv)?1:0;
       $array_liste[] = array($best,$element_aktiv);
     }

    Grüße aus Nürnberg
    Tobias

    --
    Selfcode: sh:( fo:) ch:? rl:( br:< n4:& ie:% mo:| va:) de:] zu:) fl:( ss:| ls:[ js:|
    1. mit der Funktion in_array() (->

      »»http://de3.php.net/in_array) und dem Trinitäts-Operator (->
      »»http://de3.php.net/language.operators.comparison) tust du
      »»dir hier leichter (ungetestet):

      Was meinst Du mit "Trinitäts-Operator" ??? Heißen die die ganzen Operatoren so? Oder soll das ein bestimmter sein? Ich kann dazu nichts finden...

      Nur mit foreach baut er mir ein riesen Array deswegen habe ich verschachtele Scheifen genommen. Nur was ich an meiner Schleife nicht verstehe warum er nur $i durchgeht er sollte doch normal es von oben nach untern abarbeiten und dann automatisch in die $y schleife landen bis die erfüllt ist und anschliessend wieder oben anfangen.

      $array_liste = array();
       foreach($array_bestand as $best){
         $element_aktiv = in_array($best,$array_aktiv)?1:0;
         $array_liste[] = array($best,$element_aktiv);
       }

      1. Hallo Klaus,

        [...] Trinitäts-Operator (->http://de3.php.net/language.operators.comparison) [...]
        Was meinst Du mit "Trinitäts-Operator" ???

        [ ] du hast die Zeile unter der Tabelle gelesen

        Nur mit foreach baut er mir ein riesen Array

        mit meinem Code? ich habe ihn gerade mal getestet, und er funktioniert wunderbar ...

        deswegen habe ich verschachtele Scheifen genommen. Nur was ich an meiner Schleife nicht verstehe warum er nur $i durchgeht er sollte doch normal es von oben nach untern abarbeiten und dann automatisch in die $y schleife landen bis die erfüllt ist und anschliessend wieder oben anfangen.

        in dem Code den du in [pref:t=71565&m=412018] gepostet hast, wird die innere Schleife sooft durchlaufen, bis alle Elemente abgearbeitet sind - in dem Code aus [pref:t=71565&m=412072] wird die Schleife nur genau einmal durchlaufen. Lass das break im else-Teil mal weg, dann sollte es funktionieren.

        Grüße aus Nürnberg
        Tobias

        --
        Selfcode: sh:( fo:) ch:? rl:( br:< n4:& ie:% mo:| va:) de:] zu:) fl:( ss:| ls:[ js:|
        1. Hallo Tobias

          [...] Trinitäts-Operator (->http://de3.php.net/language.operators.comparison) [...]

          Was meinst Du mit "Trinitäts-Operator" ???
          [ ] du hast die Zeile unter der Tabelle gelesen

          Trotzdem weiß ich nicht was Du mir damit sagen willst?

          Nur mit foreach baut er mir ein riesen Array
          mit meinem Code? ich habe ihn gerade mal getestet, und er funktioniert wunderbar ...

          Ich habe das mit foreach noch einmal ausprobiert aber iregendwie wird mir auch hier die Zeil if (in_array($array_aktiv, $best, true))
          angemekert egal ob ich es mit ",true" oder ohne schreibe es wird mir als falsch angemekert. Nur das Beispiel von PHP.net ist genauso aufgebaut wo nach dem Rückgabewert gefragt wird.

          $i=0;
           $array_liste = array();
           foreach($array_bestand as $best)
           {
            #if (in_array($array_aktiv, $best)) // wenn aktiv in bestand ist = true
            if (in_array($array_aktiv, $best, true)) // wenn aktiv in bestand ist = true
            {
            $array_liste[$i][0]= 1;
            }
           else
            {
            $array_liste[$i][1]= 0;
            }
           $i++;
           }

          in dem Code den du in [pref:t=71565&m=412018] gepostet hast,
          wird die innere Schleife sooft durchlaufen, bis alle Elemente
          abgearbeitet sind - in dem Code aus [pref:t=71565&m=412072] wird
          die Schleife nur genau einmal durchlaufen. Lass das break im else-
          Teil mal weg, dann sollte es funktionieren.

          Achso ja, da lag ein Denkfehler vor :( Ich habe das übersehen und woanders den Fehler gesucht...

          1. Hallo Klaus,

            Was meinst Du mit "Trinitäts-Operator" ???
            [ ] du hast die Zeile unter der Tabelle gelesen
            Trotzdem weiß ich nicht was Du mir damit sagen willst?

            mit dem Trinitäts-Operator kannst du einer Variablen in Abhängigkeit einer Bedingung einen Wert zuweisen, in meinem Beispiel wird mit:
             $element_aktiv = in_array($best,$array_aktiv)?1:0;
            der Variablen $element_aktiv der Wert 1 zugewiesen, wenn in_array($best,$array_aktiv) true zurückgibt - andernfalls bekommt die Variable den Wert 0.

            Ich habe das mit foreach noch einmal ausprobiert aber iregendwie wird mir auch hier die Zeil if (in_array($array_aktiv, $best, true))
            angemekert egal ob ich es mit ",true" oder ohne schreibe es wird mir als falsch angemekert.

            welche Fehlermeldung bekommst du? (btw: willst du wirklich Typengleichheit vorraussetzen?)

            foreach($array_bestand as $best)
              #if (in_array($array_aktiv, $best)) // wenn aktiv in bestand ist = true

            die Parameter sind falschherum - $best muss der erste Parameter sein, und $array_aktiv der zweite.

            $array_liste[$i][0]= 1;
              }
            else

            warum kopierst du eigentlich nicht einfach den Code den ich in [pref:t=71565&m=412057] gepostet habe, und setzt ihn so wie er ist in dein Script ein?
            btw: zu der Zeile
             $array_liste[] = array($best,$element_aktiv);
            noch ein Link bzüglich der eckigen Klammern: http://de3.php.net/manual/de/language.types.array.php#language.types.array.syntax.modifying

            Grüße aus Nürnberg
            Tobias

            --
            Selfcode: sh:( fo:) ch:? rl:( br:< n4:& ie:% mo:| va:) de:] zu:) fl:( ss:| ls:[ js:|
            1. warum kopierst du eigentlich nicht einfach den Code den ich in [pref:t=71565&m=412057] gepostet habe, und setzt ihn so wie er ist in dein Script ein?

              ganz einfach weil auf der php.net Seite das Beispiel genauso aufgebaut ist nur dort steht $best ganz hinten!

              $os = array("Mac", "NT", "Irix", "Linux");
              if (in_array("Irix", $os))
                 {
                 echo "Got Irix";
                 }

              Schliesslich wollte ich doch nicht bestand mit den aktiven vergleichen sondern die aktiven mit den bestand so wie es auch im Beispielcode steht! komisch ist nur das es nur andersherum funktioniert!

              Dann müssen die es dort falsch geschrieben haben! Anders kann ich mir das nicht erklären.

              Danke für Deine Mühe!

              Gruß Klaus

              1. Hallo Klaus,

                warum kopierst du eigentlich nicht einfach den Code den ich in [pref:t=71565&m=412057] gepostet habe, und setzt ihn so wie er ist in dein Script ein?
                ganz einfach weil auf der php.net Seite das Beispiel genauso aufgebaut ist nur dort steht $best ganz hinten!

                nein. In dem Script von mir steht in $best jeweils eine der Nummern aus $array_bestand drin - und kein Array (schau dir mal an, was foreach macht ->http://www.php.net/control-structures.foreach). Das Array ist der zweite Parameter ($array_aktiv) - und das wird nach $best durchsucht.

                $os = array("Mac", "NT", "Irix", "Linux");
                if (in_array("Irix", $os))

                hier ist der zweite Parameter ($os) das Array, das nach dem String "Irix" durchsucht wird.

                Grüße aus Nürnberg
                Tobias

                --
                Selfcode: sh:( fo:) ch:? rl:( br:< n4:& ie:% mo:| va:) de:] zu:) fl:( ss:| ls:[ js:|