Ankündigung

Einklappen
Keine Ankündigung bisher.

[Erledigt] Stringgenerierung aus Array

Einklappen

Neue Werbung 2019

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

  • [Erledigt] Stringgenerierung aus Array

    hallo php gemeinde ich weiß mal wieder nicht weiter und hoffe ihr könnt mir helfen:

    also ich versuche derzeit folgendes:
    ich importiere eine csv datei die mit kommas getrennt folgende felder enthält:
    familie,name,vorname,alter,größe

    die so gelesenen daten speichere ich in einem 2dimensionalem array
    so dass quasi a[0][0] den wert famile enthält etc...
    nun sollen die array positionen
    zu einem neuen string zusammengefügt werden, dieser soll dann in etwa so
    aussehen:
    $string0="erstelle mensch familie=a[x][y] name=a[x][y+1],a[x][y+2] usw.."
    und dies halt zeilenweise, so dass dann
    $string1= "erstelle mensch familie=a[x+1][y] name=a[x+1][y+1],a[x+2][y+2] usw.." entsteht
    ...

    ich habe es bisher so probiert:
    PHP-Code:
    for($x=0$x<$zeilenzahl$x++) 
                    {
                        for(
    $y=0$y<$spaltenzahl$y=$y+3)  //3=anzahl der spalten die eine Zeile hat
                          
    {     
                               
    $string='Create Mensch familie="'.$array[$x][$y].'"   name="'.$array[$x][$y+1].' ",vorname="'.$array[$x][$y+2].'"';     
                               
    fwrite...
                          }              
                    } 
    das funktioniert auch wunderbar soweit, die zeilen werden wunderbar erstellt
    (ich speicher die strings per fwrite in der inneren for schleife in einer externen text datei)

    nun endlich zu meiner eigentlichen frage:
    wie kann ich im nachhinein auf die jeweiligen array positionen zugreifen, wenn beispielsweise in einem anderen schleifendurchlauf ein
    anderer string generiert werden soll, beispielsweise etwas wie
    $neuerstring="erstelle beziehung a[x][y+1] ist vater von [a+300][y+1]

    irgendwie weiß ich da nicht direkt wie ich weiter machen soll,
    ich hoffe die lange beschreibung erschlägt euch jetzt nicht,
    danke schonmal im vorraus
    gruß luke

  • #2
    Was meinst du mit "in nachinein", was hindert dich daran, dass genau so zu machen wie du es beschrieben hast und welche Bedinungen sollen denn erfüllt sein um dieses Verhalten hervorzurufen? Zumindest mir ist nicht ersichtlich, worauf du überhaupt hinauswillst. Vorher/Nacher-Beispiel?
    [I]You know, my wife sometimes looks at me strangely. „Duncan“, she says, „there's more to life than Solaris“. Frankly, it's like she speaks another language. I mean, the words make sense individually, but put them together and it's complete nonsense.[/I]

    Kommentar


    • #3
      hm also vorher - nachher ist ja wie schon beschrieben,
      ich habe eine csv datei:
      familie,vorname,alter
      müller,hans,45
      meier,ralf,36
      müller,elfriede,16

      daraus möchte ich strings erstellen:
      $string 1 = " create family=müller vname=hans alter=45"
      $string 2 = " create family=meier vname=ralf alter=36"
      $string 3 = " create family=müller vname=elfriede alter=16"

      und jetzt möchte ich quasi nach jedem erstellten string überprüfen ob es eine übereinstimmung mit bisherigen (family=)- werten gibt um dann z.b. nach
      $string 3 sagen zu können:
      $string 3.1 = "create relationship vname=hans is father of vname=elfriede"

      und mit ,,im nachhinein'' meine ich folgendes:
      ich will nach einem kompletten schleifendurchlauf quasi alle strings (z.b. alle create familys) in eine textdatei schreiben,
      nach einem anderen schleifen durchlauf soll dann wie beschrieben nach übereinstimmungen in bestimmten arraypositionen (z.b.family=) gesucht werden und alle relationen in die gleiche textdatei unter die bisher erstellten strings gespeichert werden...

      ich hoffe jetzt ist es verständlicher, danke schonmal

      Kommentar


      • #4
        Ich versteh zwar nicht genau was du machen willst, aber wenn du Array-Elemente nach einen bestimmten Muster zusammenfügen willst, hilft dir in der Regel die Methode PHP: implode - Manual
        Beispiel von php.net
        PHP-Code:
        <?php

        $array 
        = array('lastname''email''phone');
        $comma_separated implode(","$array);

        echo 
        $comma_separated// lastname,email,phone
        Bei einem Mehrdimensionalen Array foreach-Schleife und dann auf jedes Element anwenden, oder so ähnlich.
        "My software never has bugs, it just develops random features."
        "Real programmers don't comment. If it was hard to write, it should be hard to understand!"

        Kommentar


        • #5
          das erzeugen des strings ist kein problem, wie ich bereits sagte,
          es hapert daran, wie ich in einer späteren, also quasi zweiten for for schleife durch das gesamte array iteriere und nach matchings suche...
          weiß auch net wie ich jetzt noch genauer beschreiben soll was ich machen möchte, einfacher als in meinem 2. post kann ichs leider net beschreiben^^

          Kommentar


          • #6
            Du kannst den ersten Durchlauf in ein Array schreiben.
            Danach gehst du für jedes Arrayelement das komplette Array nochmal durch und handelst entsprechend. Dabei schreibst du alles was du findest in ein zweites Array, so dass du am Ende alle Einträge + Funde in einem Array hast, dass du in die Datei schreiben kannst. Nach welchen Kriterien du das umsetzen willst ist mir schleierhaft, das Alter alleine reicht dafür ja kaum aus und du musst ggf. auch mehrere Generationen beachten (vllt. - du hast ja kein spezielles Format vorgegeben, ob die Einträge dann doppelt drinnestehen ist ja auch nicht klar).

            Code:
            Array mit allen Elementen
            Jedes Element durchlaufen
             Für jedes Element das Array nochmal durchlaufen und Beziehung herstellen
             Elemente in zweites Array schreiben
            
            zweites Array in Datei schreiben
            [I]You know, my wife sometimes looks at me strangely. „Duncan“, she says, „there's more to life than Solaris“. Frankly, it's like she speaks another language. I mean, the words make sense individually, but put them together and it's complete nonsense.[/I]

            Kommentar


            • #7
              Dann solltest du die Stelle posten an der du nicht weiterkommst, inklusive der Versuche die du bereits unternommen hast.
              "My software never has bugs, it just develops random features."
              "Real programmers don't comment. If it was hard to write, it should be hard to understand!"

              Kommentar


              • #8
                Zitat von luke.- Beitrag anzeigen

                nun endlich zu meiner eigentlichen frage:
                wie kann ich im nachhinein auf die jeweiligen array positionen zugreifen, wenn beispielsweise in einem anderen schleifendurchlauf ein
                anderer string generiert werden soll, beispielsweise etwas wie
                $neuerstring="erstelle beziehung a[x][y+1] ist vater von [a+300][y+1]
                also direkt probiert hab ich jetzt noch nichts,
                da ich nicht den ganzen tag programmieren wollte

                machen würde ich es so:
                for -> x up to $zeilenanzahl
                {
                for -> y up to $spaltenzahl
                {
                if ( array[x][y] == array[x][alle bisherigen y])
                {
                $string = " create relationship array[x][gefundenesy] is father of [aktuelles y] "
                }
                y++}
                z++}

                hm und beim schreiben des pseudocodes hab ich grad auch wieder schwierigkeiten wie ihr sicher an der formulierung merkt,
                wie vergleiche das ,,aktuell betrachtete y'' mit allen ,,bereits erstellten y''

                das ist halt die frage

                Kommentar


                • #9
                  In einer Schleife.
                  [I]You know, my wife sometimes looks at me strangely. „Duncan“, she says, „there's more to life than Solaris“. Frankly, it's like she speaks another language. I mean, the words make sense individually, but put them together and it's complete nonsense.[/I]

                  Kommentar


                  • #10
                    Meinst Du so was ?

                    PHP-Code:
                    $file             './data.csv';
                    $known_families = array();
                    $families         = array();
                    $parent         0;

                    $csv  = new SplFileObject($file'r');
                    $csv->setFlags(SplFileObject::SKIP_EMPTY SplFileObject::DROP_NEW_LINE);

                    while(!
                    $csv->eof() && ($row $csv->fgetcsv()) && $row[0] !== null) {
                        if(!isset(
                    $known_families[$row[0]])){
                            
                    $families[$parent] =  $row;
                            
                    $known_families[$row[0]] = $parent;
                            
                    $parent++;
                        }else{
                            
                    $parent++;
                            
                    $row[4] = $known_families[$row[0]];
                            
                    $families[$parent] =  $row;
                        }
                    }

                    echo 
                    '<pre>';
                    print_r($families); 
                    Macht aber natürlich nur unter bestimmten Voraussetzungen Sinn:
                    - Es gibt keine Kindes-Kinder
                    - Der Urvater steht zuerst in der Datei und alle mit demselben Namen sind direkt Kinder.

                    Sollte das nicht zutreffen musst Du das ganz anders angehen denke ich.
                    AFFE ist nur im Dezimalsystem ein Palindrom.

                    Kommentar


                    • #11
                      @agundur - deinen code versteh ich nicht wirklich

                      @chorn, ja in einer schleife, aber WIE, der vorher erstellte string hat ja quasi keine spalten mehr, wie soll ich das dann vergleichen?

                      ich hab quasi bisher folgendes:
                      PHP-Code:
                      for($k=1$k<$zeilenzahl$k++) 
                                {
                                  for(
                      $j=0$j<$spaltenzahl$j=$j+3)  
                                    {     
                                      
                      $string[$k]='create family:'.$array[$k][$j].' vorname:'.$array[$k][$j+1].' alter:'.$array[$k][$j+2].   
                                     }              
                                } 
                      und möchte jetzt feste werte des strings nochmal vergleichen und hab so begonnen:

                      PHP-Code:
                      for($k=1$k<$zeilenzahl$k++) 
                                {
                                 if (
                      $string[$k][stringposition die durchsucht werden soll] == $string[$k][stringposition mit der verglichen werden soll])
                                    {
                      $neuerstring='create relationship stringposition mit der verglichen werden soll is father of aktuelle stringposition 
                      }

                      dabei stellt sich mir nun die frage wie ich auf die ,,stringpositionen'' die vorher mal spalten eines arrays waren, zugreifen kann
                      gibt es denn sowas wie $string.array[$k][$j] oder wie soll ich das angehen,
                      vielen dank schonmal für eure geduld

                      Kommentar


                      • #12
                        Arbeite weiter auf $array... nicht mit den erzeugten Strings..
                        Über 90% aller Gewaltverbrechen passieren innerhalb von 24 Stunden nach dem Konsum von Brot.

                        Kommentar


                        • #13
                          @agundur - deinen code versteh ich nicht wirklich
                          Der code speichert Dir jede Familie als Array in ein Array und schaut ob der Familienname schon mal vorkam. Wenn dem so ist, wird an das "Familien-Array" ein Wert angehängt der den Schlüssel zum ersten vorhanden Eintrag enthält.

                          D.h. Du kannst anhand dieses Schlüssels, wenn Du auf ein Kind stößt, wieder auf die Eigenschaften des "Parents" zugreifen und damit Deinen String: "create relationship array[x][gefundenesy] is father of [aktuelles y] " zusammenbauen.

                          Dein Beispiel:
                          müller,hans,45
                          meier,ralf,36
                          müller,elfriede,16

                          Wenn Du jetzt im Schleifendurchlauf auf "müller,elfriede" stößt enthält "$row[4]" den Wert 0. Als kannst Du sagen "create relationship vname=$families[$row[4]][1] is father of vname=$row[2]"
                          AFFE ist nur im Dezimalsystem ein Palindrom.

                          Kommentar


                          • #14
                            ah okay, hm das klingt auch nicht schlecht, danke dafür,
                            ich habe mich jetzt für folgende lösung entschieden:
                            PHP-Code:
                            for($k=1$k<$zeilenzahl$k++)
                                        {             
                                          for(
                            $k2=$k+1$k2<$zeilenzahl$k2++)
                                            {
                                              if((
                            $array[$k][5])==($array[$k2][5]))
                                                {
                                                  
                            $riistring[$k]='CreateRelationShip '.$array[$k][0].'ist papa von '.$array[$k2][0].'';
                                                }              
                                            }                
                                        } 
                            lstegelitz hatte ja den glorreichen einfall einfach mit den vorher erstellten array positionen zu arbeiten, merkwürdig dass ich auf solche einfachen dinge nicht komme, bin wohl nicht der geborene programmierer

                            nichts desto trotz : danke vielmals für eure hilfen !

                            Kommentar

                            Lädt...
                            X