php.de

Zurück   php.de > Webentwicklung > PHP Einsteiger > PHP Tipps 2008

 
 
LinkBack Themen-Optionen Thema bewerten
Alt 29.05.2008, 18:54  
Neuer Benutzer
 
Registriert seit: 29.05.2008
Beiträge: 28
mathes befindet sich auf einem aufstrebenden Ast
Standard Konzeptionelles Problem WHILE-/FOR-Schleifen

Guten Abend liebes Forum,

ich bin der Neue und hoffe, hier Unterstützung zu finden und vielleicht später auch mal geben zu können

Zu meinem aktuellen Problem:
Ausgangslage ist ein array, in dem z.B. $album, $interpret, $titel und $laenge anliegen.

Ziel ist, die Daten in der Form
Code:
<DATEIANFANG>
$album
$interpret

$titel $laenge
$titel $laenge
$titel $laenge
$titel $laenge
$titel $laenge
...
<DATEIENDE>
in jeweils eine Datei pro $album zu schreiben. Und zwar so, dass $interpret und $album darin nur jeweils 1x ausgegeben werden; $titel und $laenge natürlich entsprechend der tatsächlichen Anzahl.

Mit einer WHILE- oder FOR-Schleife schaffe ich es zwar, alle zu $album gehörenden Werte in eine Datei zu schreiben, aber eben nur in der Form
Code:
<DATEIANFANG>
$album $interpret $titel $laenge
$album $interpret $titel $laenge
$album $interpret $titel $laenge
...
<DATEIENDE>

Könnt Ihr mir einen Tipp geben? Z. B. wie ich die Schleifen verschachteln müsste und wie die Bedingungen sinnvoller Weise aussehen könnten?
__________________
grüße vom mathes
mathes ist offline  
Sponsor Mitteilung
PHP Code Flüsterer

Registriert seit: 21.08.2005
Beiträge: 4682
PHP-Kenntnisse:
Fortgeschritten

Alt 29.05.2008, 19:40  
Moderator und Wett-König
 
Benutzerbild von dr.e.
 
Registriert seit: 21.05.2008
Beiträge: 3.657
PHP-Kenntnisse:
Fortgeschritten
dr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblick
dr.e. eine Nachricht über Skype™ schicken
Standard

Hallo mathes,

zunächst ein Herzliches Willkommen im Forum!

Was dein Problem angeht, so gibt es für mich zwei Lösungsmöglichkeiten:

1. Schleifendurch so konzeptionieren, dass du nur einmal pro äußerem Durchlauf Interpret und Titel schreibst.

2. Array so konzeptionieren, dass es nur einmal Interpret und Titel enthält.

Da ich keinen genauen Code kenne kann ich dir auch nur so abstrakt antworten. Alternativ arbeitest du mit Objekt-Strukturen. Hier kannst du ja ein Objekt "Album" mit den Attributen "Interpret" und Titel" und ein Objekt "Track" mit den entsprechenden Attributen entwerfen. Dabei hat das Objekt "Album" ein Attribut für die Speicherung der Titel. In dieser Liste befinden sich dann die Objekte "Track". Hast du einen Liste von "Album"-Objekten ist beim Durchlauf genau definiert, wie die Ausgabe zu erstellen ist, das es die Interpret- und Titel-Information nur einmal gibt.
__________________
Viele Grüße,
Dr.E.

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1. Think about software design before you start to write code!
2. Discuss and review it together with experts!
3. Choose good tools (-> Adventure PHP Framework (APF))!
4. Write clean and reusable software only!
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
dr.e. ist offline  
Alt 30.05.2008, 07:10  
Neuer Benutzer
 
Registriert seit: 29.05.2008
Beiträge: 28
mathes befindet sich auf einem aufstrebenden Ast
Standard

Hallo Dr.E.,
vielen Dank für die nette Aufnahme und Deine Antwort!
Vorschlag 1 müsste ich hinbekommen; die "elegantere" Methode wäre wohl 2. Die dritte Variante kann ich zwar gedanklich nachvollziehen, dazu fehlt mir aber noch etwas die Basis.
Ich melde mich später mal mit einen Statusbericht
__________________
grüße vom mathes
mathes ist offline  
Alt 30.05.2008, 11:08  
Benutzer
 
Registriert seit: 09.04.2008
Beiträge: 60
keinplanvonnix befindet sich auf einem aufstrebenden Ast
Standard

da du ja pro album eine datei hast, was spricht gegen einen solchen dateinamen:
interpret_album.datei
inhalt ist dann
$titel $laenge
$titel $laenge
$titel $laenge
$titel $laenge
$titel $laenge

oder ordner interpret, dateiname album

oder was spricht gegen eine datenbank
keinplanvonnix ist offline  
Alt 30.05.2008, 12:28  
Neuer Benutzer
 
Registriert seit: 29.05.2008
Beiträge: 28
mathes befindet sich auf einem aufstrebenden Ast
Standard Mal etwas weiter ausgeholt...

Hallo zusammen,

vielleicht sollte ich doch mal etwas konkreter werden; hier mal der Code, den ich bisher habe:

PHP-Code:
<?
#    HIER WERDEN DIE VARIABLEN "ALBUM" UND "INTERPRET" AUSGELESEN...
    
$queryFileHeader = ("SELECT album, interpret FROM alben ORDER BY interpret ASC");

    
$resultFileHeader mysql_query($queryFileHeader);


    while (
$row mysql_fetch_array($resultFileHeader)) {
        
$album $row ["album"];
        
$interpret $row ["interpret"];
        
$id $row ["id"];


#    ...UND IN DEN DATEI-HEADER GESCHRIEBEN
            
$fileHeader .= "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>";
            
$fileHeader .= "<Alben Version=\"1.0\">";
            
$fileHeader .= "<Album Name='".$album."', Interpret='".$interpret."'>";


#    NUN WERDEN FUER DAS EINZELNE "ALBUM" DIE VARIABLEN "TITEL" UND "LAENGE" AUSGELESEN...
            
$queryFileBody = ("SELECT titel, laenge FROM inhalt WHERE albumId = '$id'");

            
$resultFileBody mysql_query($queryFileBody);


            while (
$row mysql_fetch_array($resultFileBody)) {
                
$titel $row ["titel"];
                
$laenge $row ["laenge"];

#    ...UND IN DEN FILEBODY GESCHRIEBEN
                
$fileBody .= "<Titelname Type=\"Item\" Titel=".$titel." Laenge=".$laenge."/>";
                }


            
$fileFooter .= "</Album>";
            
$fileFooter .= "</Alben>";


#    SCHLIESSLICH WIRD DIE XML-DATEI LOKAL GESPEICHERT
            
$createFile fopen("".$pfad."/".$album.".xml","a+");
            
fputs($createFile,$fileHeader."\r\n".$fileBody."\r\n".$fileFooter);
            
fclose($createFile);
            }
        }
?>
Bei jedem Ausführen des Skripts wird zwar eine XML-Datei erzeugt; der Inhalt derselben ist jedoch ein unbrauchbares, verschachteltes Konglomerat aus ($fileHeader + $fileBody + $fileFooter) * Anzahl der vorhandenen Datensätze.
__________________
grüße vom mathes
mathes ist offline  
Alt 30.05.2008, 16:18  
Erfahrener Benutzer
 
Benutzerbild von lazydog
 
Registriert seit: 02.04.2008
Beiträge: 4.032
lazydog befindet sich auf einem aufstrebenden Ast
Standard

Du machst das doch etwas sehr kompliziert. Eine Abfrage genügt doch. Hier einfach mal ein beispiel für die Ausgabe in eine Tabelle:
PHP-Code:
<?
$query 
"
    SELECT 
        a.album, 
        a.interpret
        i.titel,
        i.laenge 
    FROM 
        alben 
    INNER JOIN
        inhalt i ON a.id = i.albumId
    ORDER BY 
        interpret ASC"
;

    
$result mysql_query($query) or exit(mysql_error());

    
$interpret_alt $album_alt '';
    echo 
"<table>"
    
echo "<tr><th>Interpret</th><th>Album</th><th>Titel</th><th>L&auml;nge</th></tr>\n";
    while (
$row mysql_fetch_array($result)) {
        
$interpret '';
        if (
$row["interpret"] != $interpret_alt){
            
$interpret $row["interpret"];
            
$interpret_alt $interpret;
        }
        echo 
"<tr><td>$interpret</td>";
        
$album '';
        if (
$row["album"] != $album_alt){
            
$album $row["album"];
            
$album_alt $album;
        };
        
printf("<tr><td>%s</td><td>%s</td><td>%s</td><td>%s</td></tr>",
                   
$interpret$album$row['titel'], $row['laenge']);
    }
?>
Daraus solltest du eigentlich die Datei-version ableiten können
__________________
Gruss
L
lazydog ist offline  
Alt 30.05.2008, 19:21  
Neuer Benutzer
 
Registriert seit: 29.05.2008
Beiträge: 28
mathes befindet sich auf einem aufstrebenden Ast
Standard

Hmm, kompliziert?? Echt?
Ich werde mir dein Konstrukt mal entsprechend umbauen und sehen, ob es klappt. Den JOIN-Syntax habe ich noch nicht ganz durchdrungen.
Nach Umstellen der Schleifen habe ich übrigens mittlerweile eine Version, die bis auf einen Fehler läuft. Die Daten werden jetzt in korrektem Syntax in die Datei geschrieben. Nur leider ALLE in ALLE Dateien...
Wie schaffe ich es denn, dass bei jedem Schleifendurchlauf nur die zu einem $album gehörenden Daten in eine Datei geschrieben werden?
__________________
grüße vom mathes
mathes ist offline  
Alt 02.06.2008, 09:44  
Erfahrener Benutzer
 
Benutzerbild von lazydog
 
Registriert seit: 02.04.2008
Beiträge: 4.032
lazydog befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Zitat von mathes Beitrag anzeigen
Wie schaffe ich es denn, dass bei jedem Schleifendurchlauf nur die zu einem $album gehörenden Daten in eine Datei geschrieben werden?
Indem du für jedes Album halt einen eigene Datei erstellst.
Ich sehe allerdings nicht ein, wozu es gut sein soll, Daten aus einer Datenbank in Textdateien zu speichern.
__________________
Gruss
L
lazydog ist offline  
Alt 02.06.2008, 10:37  
Neuer Benutzer
 
Registriert seit: 29.05.2008
Beiträge: 28
mathes befindet sich auf einem aufstrebenden Ast
Standard

Hi L,

Zitat:
Ich sehe allerdings nicht ein, wozu es gut sein soll, Daten aus einer Datenbank in Textdateien zu speichern.
in meinem Post habe ich der Übersichtlichkeit halber nur Beispielvariablen verwendet, da die ganze Geschichte etwas komplexer ist.

Zitat:
Indem du für jedes Album halt einen eigene Datei erstellst.
Naja, das schon, aber wie sage ich's meiner WHILE-Schleife? Die macht erst Schluss, wenn alles in der Wurst ist.
Das Skript wird zeitgesteuert ausgeführt. Zum Zeitpunkt x werden immer alle in der DB neu aufgelaufenen Daten abgefragt. Wenn man nur einen Datensatz "erwischt", ist alles wunderbar; sobald es mehrere sind, Müll.
Ich habe es sowohl mit einem break am Ende der Schleife als auch mit einem Zähler in der Schleife probiert, aber ich glaube, dass ich die Funktionweise von beiden nicht ganz verstanden habe.
__________________
grüße vom mathes
mathes ist offline  
Alt 02.06.2008, 10:54  
Erfahrener Benutzer
 
Benutzerbild von lazydog
 
Registriert seit: 02.04.2008
Beiträge: 4.032
lazydog befindet sich auf einem aufstrebenden Ast
Standard

Na, wenn du die Ableitung halt nicht schaffst:
PHP-Code:
...
    
$result mysql_query($query) or exit(mysql_error());

    
$interpret_alt $album_alt '';
    while (
$row mysql_fetch_array($result)) {
        
$interpret '';
        if (
$row["interpret"] != $interpret_alt){
            
$interpret $row["interpret"];
            
$interpret_alt $interpret;
        }
        
$album '';
        if (
$row["album"] != $album_alt){
            
$album $row["album"];
            
$album_alt $album;
            if (!empty(
$fp)){
                
fclose($fp);
            }
            
$fp fopen("$album.txt"'w');
            
fputs($fp"Artist:\t$interpret\nAlbum:\t$album\nTracks:\n");
        };
        
fprintf($fp "\t%s(%s)\n"$row['titel'], $row['laenge']);
    }
    
fclose($fp); 
Der Sinn des Ganzen ist mir allerdings immer noch völlig suspekt.
__________________
Gruss
L

Geändert von lazydog (02.06.2008 um 16:53 Uhr).
lazydog ist offline  
 


Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an
Gehe zu

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Timestamp problem phrain PHP Tipps 2008 2 04.04.2008 09:41
While schleife mit Datenbank in ein Dropdown Feld (Umlaut Problem) kintaro PHP Tipps 2008 6 28.08.2007 19:11
datensätze defekt oder problem mit dem einlesen? Ministry Datenbanken 4 06.07.2006 18:42
problem!!! PHP Tipps 2006 6 08.02.2006 11:06
[Erledigt] wieder ein Problem bei phpmailer und smtp PHP Tipps 2006 24 07.02.2006 01:07
Problem mit while PHP Tipps 2007 2 23.11.2005 13:06
Problem mit while und insert into PHP Tipps 2005-2 6 15.08.2005 19:29
[Erledigt] Problem mit Backslash Patrick Schwarz PHP Tipps 2005-2 5 26.07.2005 09:54
[Erledigt] Problem mit User/Group: nobody(99)/99 Server, Hosting und Workstations 3 09.07.2005 15:31
While Schleifen Problem PHP Tipps 2005 9 22.05.2005 22:35
problem mit while und include notyyy PHP Tipps 2005 1 16.05.2005 17:10
Problem: Sortierung von Statistiken nach Timestamp pixelcut PHP-Fortgeschrittene 2 02.03.2005 14:51
Problem mit alter JavaScript-Funktion woods PHP Tipps 2004 1 13.08.2004 13:34
Problem mit Länge des Rückgabestrings bei fsockopen PHP-Fortgeschrittene 1 06.08.2004 18:54
PHP MySQL Problem mit Hyperlink in einer While Schlaufe PHP Tipps 2004 20 09.07.2004 13:46

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
for schleifen verschachteln, while schleifen verschachteln, wofür while php, while list php nur einmal, wozu while schleife, while schleife php db objekt, schleife nur 1x ausführen php, for schleife wozu, while schleife mit xml datei, for-schleife wofür, php bedingungen f, while oder was, php while schleife wofür, script in while schleife nur einmal ausführen php, konzeptionelles problem, c \while in for-schleife\

Alle Zeitangaben in WEZ +2. Es ist jetzt 16:04 Uhr.




Powered by vBulletin® Version 3.7.2 (Deutsch)
Copyright ©2000 - 2012, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0
Aprilia-Forum, Aquaristik-Forum, Liebeskummer-Forum, Zierfisch-Forum, Geizkragen-Forum