Ankündigung

Einklappen
Keine Ankündigung bisher.

Array ist nicht gleich Array oder was?

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Array ist nicht gleich Array oder was?

    Hallo zusammen
    Ich hoffe ihr konnt mir weiterhelfen, ich bin mittlerweile an dem Punkt angekommen, an welchem ich anfange, an mir zu

    zweifeln, was das Programmieren angeht.

    Zuerst einmal die Umgebungsdetails:
    • Apache/2.0.59 (Unix) PHP/4.4.4
    • PHP 4.4.4 (5 kommt momentan nicht in Frage, für diverse Applikationen müssen 100e Scripts umgeschrieben werden)
    • Oracle 10.2.0.3


    Ich muss für im Betrieb ein Script machen, welches den Bestand einer Tabelle in der Oracle-Datenbank abfragt und mit einem

    importierten txt-File vergleicht. Nach diesem Vergleich kommen entweder INSERT-, UPDATE- oder DELETE-Befehle, um die DB zu

    aktualisieren.

    Folgendes habe ich bereits erarbeitet:

    PHP-Code:
    <?php
    function printr($array)
    {
        print 
    "<pre>";
        
    print_r($array);
        print 
    "</pre>";
    }

    // erster array: neue daten
    $txtfile file("data.txt");
    $txt = array();
    for(
    $i 0$count sizeof($txtfile); $i $count; ++$i)
    {
        
    $txt[$i] = explode(";"$txtfile[$i]);
        
    trim($txt[$i]);
    }

    $txtarr = array();
    for(
    $i 0$i $count; ++$i)
    {
        
    $txtarr[$i] = $txt[$i][1];
    }

    for(
    $i 0$i $count; ++$i)
    {
        if(empty(
    $txtarr[$i]))
        {
            
    //Debugging Ausgabe
            
    print "Found an empty value: Array Key #".$i;
            print 
    "<br>";
            unset(
    $txtarr[$i]);
        }
    }
    sort($txtarr);

    // zweiter array: bestehende daten
    $sql "SELECT irgendwas FROM irgendwo WHERE irgendwas='irgendwo'";

    $oraarr = array();
    $i 0;
    $rs $dbc->Execute($sql);

    while(!
    $rs->EOF)
    {
        
    $oraarr[$i] = $rs->Fields("irgendwas");
        
    trim($oraarr[$i]);
        ++
    $i;
        
    $rs->MoveNext();
    }
    sort($oraarr);

    //Debugging Ausgabe
    printr($txtarr);
    print 
    "<br><br>";
    printr($oraarr);
    print 
    "<br><br>";
    ?>
    Das gibt folgendes aus:

    PHP-Code:
    <?php
    //Textfile

    Array
    (
        [
    0] => DATEN 1

        
    [1] => DATEN 2

        
    [2] => DATEN 3

        
    [3] => DATEN 4

        
    [4] => DATEN 11
    )

    //Oracle DB

    Array
    (
        [
    0] => DATEN 1
        
    [1] => DATEN 2
        
    [2] => DATEN 3
        
    [3] => DATEN 4
        
    [4] => DATEN 5
    )
    ?>
    Wenn ich diese Arrays beispielsweise nun mit einem array_diff vergleichen will, erhalte ich immer alle Daten zurück anstelle

    nur den Daten, welche sich unterscheiden.

    Ich habe es nun schon soweit getrieben, dass ich eine riesige Schlaufe geschrieben habe, um alle Werte manuell zu

    vergleichen, was so aussieht:

    PHP-Code:
    <?php
    foreach($txtarr as $key => $value)
    {
        for(
    $i 0$count sizeof($oraarr); $i $count; ++$i)
        {
            if(
    $value == $oraarr[$i])
            {
                print 
    "[".$key."][".$i."] ist gleich -> Update!<br>";
                if(
    $value === $oraarr[$i])
                {
                    print 
    "[".$key."][".$i."] ist identisch -> Update!<br>";
                }
            }
            elseif(
    $value != $oraarr[$i])
            {
                print 
    "[".$key."][".$i."] ist nicht gleich:<br>File: ".$value."<br>DB: ".$oraarr[$i]."<br>";
            }
            print 
    "<br>";
        }
    }
    ?>
    Dies ergibt folgende Ausgaben:

    PHP-Code:
    <?php
    [0][0ist nicht gleich:
    FileDATEN 1 
    DB
    DATEN 1

    [0][1ist nicht gleich:
    FileDATEN 1 
    DB
    DATEN 2

    [0][2ist nicht gleich:
    FileDATEN 1 
    DB
    DATEN 3

    [0][3ist nicht gleich:
    FileDATEN 1 
    DB
    DATEN 4

    [0][4ist nicht gleich:
    FileDATEN 1 
    DB
    DATEN 5

    //etc
    ?>
    Also halten wir nun fest: "DATEN 1" != "DATEN 1".

    Nach langem suchen habe ich nun festgestellt, dass $txtarr hinter jeden value ein " " Leerzeichen macht, welches ich aber trotz trim() oder rtrim() resp. rtrim($txtarr, " ") nicht wegbekomme.

    Ich komme nun einfach nicht mehr weiter, kann ich noch was ausprobieren oder kennt hier jemand gerade die Lösung?

    Vielen Dank für eure Mühen!
    Gruss JeK


  • #2
    beschäftige Dich noch mal mit den Array-Grundlagen:
    Quakenet/#php Tutorial - de - Arrays

    und benutze foreach - ist ne feine Sache.

    eine riesige Schlaufe
    Schlaufen gibt es an den Schuhen oder beim Henker
    aber nicht bei PHP.
    Eine if-else-Abfrage nimmt, ordentlich geschrieben eine Menge Platz weg. Platzsparend geht es mit einem ternären Operator.

    Kommentar


    • #3
      PHP-Code:
      //Statt:
          
      trim($txt[$i]); 
      //wolltest du sicher schreiben:
          
      $txt[$i] = trim($txt[$i]); 
      Ich muss für im Betrieb ein Script machen, welches den Bestand einer Tabelle in der Oracle-Datenbank abfragt und mit einem importierten txt-File vergleicht. Nach diesem Vergleich kommen entweder INSERT-, UPDATE- oder DELETE-Befehle, um die DB zu
      Wenn die Tabelle nach der Verarbeitung exakt der Textdatei entsprechen soll, dann mach einfach TRUNCATE TABLE nebst INSERT INTO und fertig.
      PHP-Code:
      if ($var != 0) {
        
      $var 0;

      Kommentar


      • #4
        Den Unterschied kann man doch in der Ausgabe sehen: Für das erste Feld werden (zusätzliche) Zeilenumbrüche angezeigt, für das zweite nicht. Die Zeichenketten im ersten Feld enthalten also ein oder mehrere Zeilenumbruch-Zeichen.

        PHP: file - Manual
        Hinweis: Jede Zeile in dem resultierenden Array enthält das Zeilenende, weshalb Sie trim() verwenden müssen, falls der Zeilenumbruch nicht vorhanden sein soll.

        Kommentar


        • #5
          Zitat von Koala Beitrag anzeigen
          beschäftige Dich noch mal mit den Array-Grundlagen:
          Quakenet/#php Tutorial - de - Arrays
          Thx für das schnelle posten. Allerdings bringt mich das nicht weiter, weil ich da ebenfalls schon nach einer Lösung gesucht habe

          Zitat von Koala Beitrag anzeigen
          und benutze foreach - ist ne feine Sache.
          was ist dann das:

          PHP-Code:
          <?php
          foreach($txtarr as $key => $value)
          {
              
          //blah
          }
          ?>

          Zitat von Koala Beitrag anzeigen
          Schlaufen gibt es an den Schuhen oder beim Henker
          aber nicht bei PHP.
          rofl hab ich gar nicht gemerkt ^^ natürlich sind Schleifen gemeint

          Kommentar


          • #6
            was ist dann das:
            Auch diese Frage wurde schon mannigfaltig beantwortet. [man]foreach[/man]
            --

            „Emoticons machen einen Beitrag etwas freundlicher. Deine wirken zwar fachlich richtig sein, aber meist ziemlich uninteressant.
            Wenn man nur Text sieht, haben viele junge Entwickler keine interesse, diese stumpfen Texte zu lesen.“


            --

            Kommentar


            • #7
              Es hat geklappt!

              Vielen Dank euch allen, ihr wart eine grosse Hilfe!

              Gruss JeK

              PS: der trim() am richtigen Ort wirkt wunder

              PHP-Code:
              <?php 
              // erster array: neue daten 
              $txtfile file("data.txt"); 
              $txt = array(); 
              for(
              $i 0$count sizeof($txtfile); $i $count; ++$i

                  
              $txt[$i] = explode(";"$txtfile[$i]);


              $txtarr = array(); 
              for(
              $i 0$i $count; ++$i

                  
              $txtarr[$i] = trim($txt[$i][1]);
              }
              ?>

              Kommentar


              • #8
                Zitat von nikosch Beitrag anzeigen
                Auch diese Frage wurde schon mannigfaltig beantwortet. [man]foreach[/man]
                Das war ironisch gemeint, da ich es schon im Code verwendet habe... sry

                Kommentar


                • #9
                  Wozu eigentlich 2 Schleifen in #7? $txt wird doch mit gleichem Index verwendet? Da kannste doch auch gleich trim und Arrayerzeugung in der ersten Schleife ausführen.

                  Zudem: $txt ist durch das explode ein Array. trim erwartet aber einen String, das sollte also so nicht funktionieren...
                  --

                  „Emoticons machen einen Beitrag etwas freundlicher. Deine wirken zwar fachlich richtig sein, aber meist ziemlich uninteressant.
                  Wenn man nur Text sieht, haben viele junge Entwickler keine interesse, diese stumpfen Texte zu lesen.“


                  --

                  Kommentar

                  Lädt...
                  X