Larry29996: Array durchsuchen und match zeile + nachfolgende ausgeben

Hallo allerseits,

ich habe ein Array welches sich fortlaufend wiederholt.
Das Array sieht in etwa so aus

[0] -->
[1] --> "Müll Text"
.
.
[x] --> "1. Text"    #wichtige Zeile
[x+1] --> "Text"     #wichtige Zeile
[x+2] --> "Müll Text"
.
.
[2x]--> "2. Text"    #wichtige Zeile
[2x+1] --> "Text"     #wichtige Zeile
[2x+2] --> "Müll Text"
.
.
Ich habe also ein Array mit vielen Zeilen. Für mich ist jede Zeile interessant die mit "[Zahl].leerzeichen" beginnt und jede nachfolgende Zeile.

Wie könnte ich eine for Schleife mit z.B. array_search aufbauen um die korrekten Zeilen samt Inhalt zu bekommen?

Vielen Dank im Voraus

  1. Wie könnte ich eine for Schleife mit z.B. array_search aufbauen um die korrekten Zeilen samt Inhalt zu bekommen?

    Hast Du noch gar nichts?

    Eine for-Schleife wäre geeignet und überschaubar.

    1. Array
      (
          [0] =>
          [1] => Results for:  Damian  [refine search]
          [2] => Exact Spelling: On
          [3] => Matches: All Sources - 352
          [4] => Ancestral File
          [5] => 1. Ana Maria DAMIAN - Ancestral File
          [6] => Gender: F Birth/Christening: < 1754 Of Schwegenheim
          [7] =>
          [8] => 2. Ann Margaretha DAMIAN - Ancestral File
          [9] => Gender: F Birth/Christening: 1 Dec 1676 Duttweiler, Bayern, Germany
          [10] =>
          [11] => 3. Anna Maria DAMIAN - Ancestral File
          [12] => Gender: F Birth/Christening: 1722 Bobingen, , Germany
          [13] =>
          [14] => 4. Anna Maria DAMIAN - Ancestral File
          [15] => Gender: F Birth/Christening: Abt 1760 Bonn, Pruisen, Duitsland
          [16] =>
          [17] => 5. Anton DAMIAN - Ancestral File
          [18] => Gender: M Birth/Christening: 1770
          [19] =>

      Und so geht es halt weiter. Ab und an kommt noch etwas dazwischen.
      Ich brauche halt alle Zeilen die mit einer Zahl beginnen und jede nachfolgende Zeile.

      Danke.

      1. Dieser Beitrag enthält keine neuen entscheidenden Informationen oder Fragen.

        Hast du schon einen Lösungsansatz? Wenn nein, weißt Du was eine for-Schleife ist? Wenn nein, hast Du schon nachgesehen, was eine for-Schleife ist? Wenn nein, tue es jetzt oder Du bist im falschen Forum, wenn ja, hast Du schon versucht damit zu einer Lösung zu kommen?

        1. Ja ich weiß was eine for Schleife ist.
          Ich habe einen Ansatz als Lösungsversuch, jedoch scheitert es an dem (ich glaube regulären Ausdruck) für die Zahlen.

          Ich wollte es jetzt so in etwa versuchen:

          for ($i=0;$i<=$anzahl;$i++)
          {
            if (!empty(strpos($daten_split[$i], '[^1-1000]". "')))
            {
              $i = $i+1;
            }
            else
            {
              unset($daten_split[$i]);
            }
          }

          Sprich gehe durch das ganze Array, wenn du in der Zeile ein Ergebniss von strpos bekommst mache xxx ansonsten lösche die Zeile. Allerdings inst in der ersten if etwas falsch.

          Fatal error: Can't use function return value in write context

          1. Ich habe einen Ansatz als Lösungsversuch, ...

            Dann poste den doch gleich, fürs Nächste mal.

            ... jedoch scheitert es an dem (ich glaube regulären Ausdruck) für die Zahlen.
            ...
              if (!empty(strpos($daten_split[$i], '[^1-1000]". "')))

            strpos verarbeitet keine regulären Ausdrücke, preg_match macht das z.B.

            Dein regulärer Ausdruck ist aber auch falsch, in die eckigen Klammern gehören Zeichen (z.B. Ziffern) und keine (mehrstelligen) Zahlen. Man muß aber auch nicht mit selbstdefinierten Zeichenklassen arbeiten.
            http://de.wikipedia.org/wiki/Regul%C3%A4re_Ausdr%C3%BCcke#Vordefinierte_Zeichenklassen

            1. Hallöchen,

              ähem, wie wär's mit

              '/($[0-9]+. )/'

              $ bedeutet, dass ein Treffer auf das folgende Muster am Zeilenanfang stehen muss
              [0-9] schränkt die zulässigen nächsten Zeichen auf Zahlen ein

              • heißt ein oder mehr Zeichen, wie sie unmittelbar vorher definiert wurden
                . ist der Punkt als Punkt (ohne den Backslash steht der Punkt für ein beliebiges Zeichen)

              Die Klammern drücken aus, dass das Ganze zusammengehört. Außerdem wird damit deutlicher, dass das letzte Zeichen des Suchmusters ein Leerzeichen ist.

              Die beiden / sind die "Delimiter" und kennzeichnen, wo das Suchmuster beginnt bzw. aufhört.

              Und die Hochkommata, weil das Ganze ein String ist.

              MfG
              vaudi

              1. Sieht richtig aus, die runden Klammern sind aber unnötig (erzeugen nur nicht benötigte Einträge in $treffer).

                1. Hallöchen,

                  Sieht richtig aus, die runden Klammern sind aber unnötig (erzeugen nur nicht benötigte Einträge in $treffer).

                  Sie schaden nichts, im Gegenteil, sie nützen auch nichts ;)

                  außer der Verständlichkeit für <input type="Mensch"> den Programmierer </input>

                  Unnötige Treffer dürfte man hier ausschließen können, da es nach den vorliegenden Info's pro zu durchsuchenden Inhalt nicht mehr als eine Zeile gibt, und der Treffer durch das $-Zeichen an den Zeilenanfang festgenagelt ist...

                  MfG
                  vaudi

                  1. Hallo vaudi,

                    danke erstmal für die Antwort. Scheint das zu sein was ich brauche :)
                    Jedoch hat er wenn ich es genauso gemacht habe nichts ausgegeben.
                    Erst als ich $ durch ^ ersetzt habe.

                    Im prinzip macht doch ^ das selbe oder? ^ gibt doch an das es am Zeichenanfang sein muss oder ?

                    Auf jedenfall geht alles soweit :) Danke

                    1. Hallöchen,

                      aus nem anderen Posting von mir in diesem Thread:

                      Und bissl was sollte ja für den guten Larry noch zu tun übrigbleiben, oder?

                      Auf jedenfall geht alles soweit :) Danke

                      gern geschehn.

                      MfG
                      vaudi

                    2. Erst als ich $ durch ^ ersetzt habe.

                      Was richtig war, denn ^ steht für den Zeilenanfang (außer innerhalb eckiger Klammern) und $ für das Zeilen- oder Stringende. Den Fehler hatte ich auch übersehen.

              2. Moin!

                ähem, wie wär's mit

                '/($[0-9]+. )/'

                $ bedeutet, dass ein Treffer auf das folgende Muster am Zeilenanfang stehen muss

                Nicht bei meiner Interpretation von Regexen. Da steht $ für das ENDE.

                - Sven Rautenberg

                --
                "Love your nation - respect the others."
            2. for ($i=0;$i<=$anzahl;$i++)
              {
                if (preg_match("/^\d/", $daten_split[$i]) == TRUE)
                {
                  $i = $i+1;
                }
                else
                {
                  unset($daten_split[$i]);
                }
              }

              Ok das scheint zum richtigen Ergebniss zu führen :)

              Danke.

              1. if (preg_match("/^\d/", $daten_split[$i]) == TRUE)

                1. Das entspricht aber nicht der Bedingung "[Zahl].leerzeichen".
                2. preg_match gibt niemals true zurück. Auch wenn es funktioniert, das ist unsauber.

          2. PS.: zu empty: "Gibt FALSE zurück, wenn var  einen nicht-leeren und von 0 verschiedenen Wert hat."

            strpos würde in deinem Beispiel 0 zurück, da es den Suchausdruck auf dieser Position finden würde.

  2. Hallöchen,

    ... Für mich ist jede Zeile interessant die mit "[Zahl].leerzeichen" beginnt und jede nachfolgende Zeile.

    Die "interessante Zeile" findest du am besten mit preg_match() heraus.

    Und die Schleife sollte dann sinngemäß den Aufbau haben:

      
    $wichtig = array();  
    for($i=0;$i<count($vorhanden);$i++) {  
      if(preg_match([Suchmuster],$vorhanden[$i])) { //findet die erste wichtige Zeile  
        $wichtig[] = $vorhanden[$i];       //übernimt diese in das Ergebnis  
        $wichtig[] = $vorhanden[$i+1];     //und die nächste Zeile auch gleich  
        continue;  
      }  
    }  
    
    

    Das korrekte [Suchmuster] solltest du schon selbst finden...

    MfG
    vaudi

    1. $wichtig = array();
      for($i=0;$i<count($vorhanden);$i++) {
        if(preg_match([Suchmuster],$vorhanden[$i])) { //findet die erste wichtige Zeile
          $wichtig[] = $vorhanden[$i];       //übernimt diese in das Ergebnis
          $wichtig[] = $vorhanden[$i+1];     //und die nächste Zeile auch gleich
          continue;
        }
      }

        
      Falls der Inhalt von $vorhanden[$i+1] mit dem Suchmuster beginnt, gibt es ein vermutlich ungewünschtes Verhalten. Falls das Verhalten doch gewünscht ist, ist die Lösung des Fragestellers diesbezüglich auch falsch.
      
      1. Hallöchen,

        Der LösungsVORSCHLAG bezieht sich auf die Vorgabe. Und nach den Beispielen, die zu dem Zeitpunkt da waren, wo ich geschrieben hab, dürfte es keine Probleme geben.

        Wie lautet doch der schöne Spruch über den Sozialismus: Theorie ist Marx, Praxis ist Murx.

        Und bissl was sollte ja für den guten Larry noch zu tun übrigbleiben, oder?

        MfG
        vaudi