Ankündigung

Einklappen
Keine Ankündigung bisher.

foreach() wird einmal zu oft durchlaufen

Einklappen

Neue Werbung 2019

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

  • foreach() wird einmal zu oft durchlaufen

    in folgender kombination aus preg_match_all() und foreach() wird der foreach() part einmal zu oft durchlaufen, wobei beim letzten durchlauf alle felder leer sind. warum? welche abhilfe gibt es?


    Code:
    if ($row->textwriter) {
    
    $pattern = '
    /                    # Delimiter
    (?:(.*?))?           # AGSzabo
    (?:@(.*?))?          # Dilandau
    (?:\[(.*?)\])?       # Andreas G. Szabo
    (?:\{(.*?)\})?       # München
    (?:@(.*?))?          # Dilandau zweite mögliche position
    (?:\/(.*?))?         # Schneidersitz 
    (?:\((.*?)\))?       # was in den klammern ist
    (?:,|$)	             # komma muss trennend vorhanden sein
    /isx';     
    preg_match_all($pattern, $row->textwriter, $array, PREG_SET_ORDER);
    
    	$lincol = $linecolor;
    
    	echo '<tr class="',$linecolor,'"><td class="label">';
    	echo 'Text';
    	echo '</td><td>';
    
    echo '<table class="inner" cellspacing="0" cellpadding="0"><tr class="innerheadrow">
    <td>By</td><td>Text</td><td>Of</td><td>Realname</td><td>Origin</td>
    </tr>';
    
    ################################
    ############ HIER ###############
    ################################
    
    foreach($array as $line) {
    
            $linecolor = switchcolor($linecolor);
    	echo '<tr class="',$linecolor,'">';
    
    	echo '<td>',$line[1],'';
    	if (!$line[2]) $line[2] = $line[5];
    	if ($line[2]) echo ', aka ',$line[2],'';
    	echo '</td>';
    
    	echo '<td>',$line[7],'</td>';
    	
    	# gruppe(n)
    
    	if (!$line[6]) $line[6] = $row->gruppe;
    
    	$ind = 0;
    	$names = explode('&', $line[6]);
    	foreach($names as $name) {
    		if ($name) $names[$ind] = ''.$name.'';
    		$ind++;
    	}
    	$name = implode(', ', $names);
    	
    	echo '<td>',$name,'</td>';
    	
    	# Realname und Origin
    
    	if ($line[3]) $line[3] = "****";
    
    	echo '<td>',$line[3],'</td>';
    	echo '<td>',$line[4],'</td>';
    		
    	echo '</tr>';
    }
    
    ####################################
    ############### BIS HIER ############
    ####################################
    
    echo '</table>';
    
    	echo '</td></tr>';
    
    	# restore previous state
            $linecolor = switchcolor($lincol);
    }

  • #2
    Die unendliche Geschichte Teil 47...

    Faulpelze wie ich hätten schon längst das halbgare Datenformat geändert.

    Kommentar


    • #3
      dieses problem jetzt hat aber nix mit dem datenformat zu tun. änderungen sind außerdem in vorbereitung.

      Kommentar


      • #4
        Zitat von Dilandau
        dieses problem jetzt hat aber nix mit dem datenformat zu tun. änderungen sind außerdem in vorbereitung.
        a. laß Dir doch einfach mal das array anzeigen
        b. vermutlich ist es das letzte Komma des letzten "Datensatzes", das preg_match_all() den Rest vom Komma bis zum Stringende noch mal parsen läßt, obwohl da nix mehr verwertbares kommt.

        Kommentar


        • #5
          ich habe doch die letzte zeile mit ?: von den ergebnissen ausgeklammert. so sehe ich darin ein problem von php und wuesste gerne wie ich vom array manuell den letzten eintrag streichen kann?

          Kommentar


          • #6
            Zitat von Dilandau
            ich habe doch die letzte zeile mit ?: von den ergebnissen ausgeklammert.
            Aha:
            Code:
            (?:,|$)                # komma muss trennend vorhanden sein
            Und was passiert, wenn nach dem letzten Datensatz vor dem Stringende noch ein Komma gefunden wird?

            http://test.php-help.info/test/29/ (Quelltext wird angezeigt)
            so sehe ich darin ein problem von php
            Nein. Das Komma trennt und beendet nicht. preg_match_all() sucht bis zum Stringende.
            und wuesste gerne wie ich vom array manuell den letzten eintrag streichen kann?
            Laß bei der Ausgabe die Einträge weg, bei denen relevante Angaben nix enthalten. Du kannst Dich ja möglicherweise nicht darauf verlassen, daß jedes mal der letzte Datensatz mit ,\n oder ,\r\n endet.

            Kommentar


            • #7
              danke für dein beispiel aber bei mir sind keine kommas am ende, ich habe nachgeschaut. die strings hören alle einfach auf.

              Kommentar


              • #8
                Beispiele?

                Kommentar


                • #9
                  kein grund zur besorgnis, die strings sind wirklich so, dass sie einfach aufhören.

                  Kommentar


                  • #10
                    wie kappe ich nun den letzten eintrag aus einem array?

                    Kommentar


                    • #11
                      Zitat von Dilandau
                      ich habe doch die letzte zeile mit ?: von den ergebnissen ausgeklammert.
                      Gerücht. Lass deine Regex mal auf den String "," los.
                      Es werden zwei Einträge gefunden, das Komma und nichts.

                      Das ist ein Problem der Regex, nicht von PHP, da sie am Stringende auch den leeren String matched.

                      Zitat von Dilandau
                      so sehe ich darin ein problem von php und wuesste gerne wie ich vom array manuell den letzten eintrag streichen kann?
                      Wenn Du die kaputte Regex weiterverwenden willst, kannst Du array_pop() benutzen.
                      http://de2.php.net/array_pop

                      Kommentar


                      • #12
                        ah, danke, es funktioniert. aber wie "repariere" ich die "kaputte" regex?

                        Kommentar


                        • #13
                          Indem Du ihr abgewöhnst, "nichts" für ein Ergebnis zu halten.
                          Im Moment wird "NichtsNichtsNichtsNichtsNichtsNichtsNichtsStringe nde" gefressen.

                          Nichts genaues weiss man eh nicht, wenn man nicht weiss, womit die Regex überhaupt gefüttert wird.

                          Kommentar


                          • #14
                            der durchsuchte text sieht zB so aus:

                            Code:
                            $TXT = '
                            AGSzabo@Dilandau[Andreas G.
                            Szabo]{München}/Schneidersitz(Loadertune@protracker/mod.loader|20342,
                            mod.end|23124),
                            
                            Einstein / Warfalcons(mod.einstein-2c8|30214, mod.einstein-b1.remix|77042,
                            mod.einstein-2c9|116840, mod.einstein-2d2|61020),Jesper
                            Kyd/Silents(mod.egyptian), [Jochen Hippel](coso/MontyOnTheRun),
                            
                            Bit Arts[ Robert Roecher ]@RR/RSI(protracker/mod.wasteland,mod.space2,mod.ba1),
                            Romeo Knight(mod.rsi-hard|100766,mod.7rsi rise up|212386),
                            SCS,
                            Mark2/Quadlite(mk2/loadertune),
                            Donovan(mod.bar brian)';
                            die frage war, wie ich den regex so mache, dass er zum schluss nimmer 'n leeres glied des arrays abgibt.

                            Kommentar


                            • #15
                              Zitat von Dilandau
                              der durchsuchte text sieht zB so aus:
                              Ist das Komma zu Beginn Zufall oder Absicht?

                              Kommentar

                              Lädt...
                              X