umgekehrt ausgeben
schwarze Piste
- php
0 jobo0 suit0 Tom- menschelei
0 suit
0 Tom
Tachchen!
Ich kann noch immer nicht programmieren, bastele also noch immer an fremden
Codeschnipseln mit viel Zeit und selfphp/php.net herum. o_0
Aktuell möchte ich eine Liste von Links erstellen, die sich automatisch
erstellt aus den jeweils vorhandenen Ordnern in einem "Sammelordner".
Das stelle ich bislang wie folgt an.
<ul id="galerienliste">
<?php
$ordner = "./galerien";
$erstellen = opendir($ordner);
while ($file = readdir ($erstellen)) {
if($file != "." && $file != "..") {
if(is_dir($ordner."/".$file)) {
$compl = $ordner."/".$file;
echo "<li><a href=\"".$compl."\">".$file."</a></li>\n";
}
}
}
closedir($erstellen);
?>
</ul>
Dort benenne ich die Ordner nun nach dem Schema Jahr_Monat_Tag.
Das ist weder schön noch besonders elegant, aber es tut am Ende jedenfalls,
was ich gerne hätte.
Nur landet in dieser Liste natürlich der älteste Eintrag oben und der
neuste unten. Ich hätte es aber gerne genau umgekehrt.
Kann mich da mal jemand in die Richtung einer Lösung schubsen? Danke!
Gruß
Die schwarze Piste
Hallo,
Nur landet in dieser Liste natürlich der älteste Eintrag oben und der
neuste unten. Ich hätte es aber gerne genau umgekehrt.Kann mich da mal jemand in die Richtung einer Lösung schubsen? Danke!
Zwischenspeichern in einem Array, das sortieren, dann erst Links produzieren.
Gruß
jobo
Tachchen!
Zwischenspeichern in einem Array, das sortieren, dann erst Links produzieren.
Hehe ... ja, sowas habe ich mir gedacht. ;-)
Nein, ohne Spaß, wenn man nach "php sortieren" o.ä. sucht, findet man genau
sowas und ich habe da alles durchforstet.
ABER:
Mein Posting hat schon eine so nebulöse Überschrift, weil ich weder weiß,
was ein Array ist noch wie man es herstellt. Bis eben habe ich z.B. nur
vermutet, dass meine Ausgabe kein Array ist.
Die wirklich schönen Lösungen scheitern bei mir an Programmierbasics.
Du wirst mir also im Zweifel auf die Sprünge helfen müssen bei den
(für mich) ominösen Arrays ... wenn es keine andere Lösung gilt.
Gruß
Die schwarze Piste
Die wirklich schönen Lösungen scheitern bei mir an Programmierbasics.
Du wirst mir also im Zweifel auf die Sprünge helfen müssen bei den
(für mich) ominösen Arrays ... wenn es keine andere Lösung gilt.
Du könntest dich aber auch durch die Dokumentation von PHP "wühlen" und lernen was Arrays sind - die "Basics" zu erlernen bleibt dir nicht erspart.
Hallo,
Mein Posting hat schon eine so nebulöse Überschrift, weil ich weder weiß,
was ein Array ist noch wie man es herstellt.»»
Du wirst mir also im Zweifel auf die Sprünge helfen müssen bei den
(für mich) ominösen Arrays ...
Google kann dir sicher weiterhelfen.
Stell dir ein Array als einen Aktenschrank vor.
Auf den Schubfächern stehen z.B. jeweils ein Buchstabe aus dem Alphabet.
In den Schubfächern können dann Akten sein die widerum sehr wahrscheinlich Inhalt haben.
Es handelt sich, vereinfacht gesagt, also um eine Anordnung von Daten in Baumstruktur.
Im Gegensatz zu einer Variablen der nur 1 Wert zugewiesen werden kann.
Grüße, Matze
hi,
Mein Posting hat schon eine so nebulöse Überschrift, weil ich weder weiß,
was ein Array ist noch wie man es herstellt.
http://www.php.net/manual/de/function.scandir.php -- gibt dir ein Array zurück und ist recht Simpel.
Das arbeiten mit Arrays macht Spass -- für mich waren die dinger damals auch sehr Furchteinflössend (mir wurde schon von der erwähnung eines Arrays Bibber und Bange), seitdem ich sie aber besser kennengelernt habe, mag ich sie sehr ;)
mfg
Tachchen!
http://www.php.net/manual/de/function.scandir.php -- gibt dir ein Array zurück und ist recht Simpel.
Zumindest bringt er mich einen Schritt weiter. Danke.
Jetzt muss ich nur noch heute Abend mal in Ruhe überlegen, wie man damit
eine sinnvolle Ausgabe hinbekommt. Und irgendwann wird sich sicher auch
der Moment einstellen, wo mir Arrays als Konstrukt einleuchten. ;-)
Gruß
Die schwarze Piste
hi,
Und irgendwann wird sich sicher auch der Moment einstellen, wo mir Arrays als Konstrukt einleuchten. ;-)
Es ist wirklich nicht schwer, machen wir ein Beispiel:
error_reporting(E_ALL | E_STRICT);
header("content-type: text/plain");
// erstmal ein Array anlegen
$_myfirstarray = array(
'Name' => 'schwarze'
,'Nachname' => 'Piste'
,'Beruf' => 'Fotograf'
,'Wohnort' => 'iwo in Europa'
,'Alter' => 'Keine Ahnung ;)'
);
var_dump($_myfirstarray); // Kontrollausgabe -- Das Array in Nackter Form
/*
* Das Array über eine Schleife in eine Liste schreiben
*/
$_Liste = ''; // Variable initialisieren
foreach($_myfirstarray as $_Schluessel => $_Wert)
{
$_Liste .= "$_Schluessel = $_Wert\n"; // bei jedem durchlauf die neuen Werte an die Liste hängen
}
echo $_Liste;
Wenn du dieses Beispiel verstehst, dürfte dir dein Vorhaben mit scandir() nicht schwer fallen.
Vielleicht 10, höchstens 15 Zeilen Code (ohne Kommentare).
mfg
Tachchen!
Wenn du dieses Beispiel verstehst, dürfte dir dein Vorhaben mit scandir() nicht schwer fallen.
Vielen Dank für die Mühe!
Ich habe gerade keine Zeit, werde mich aber heute Abend mit deinem Beispiel
beschäftigen und auf jeden Fall Rückmeldung geben ... schlimmstenfalls mit
dummen Rückfragen. ;-)
Gruß
Die schwarze Piste
hi,
schlimmstenfalls mit
dummen Rückfragen. ;-)
Passt schon.
Immerhin besser als gar keine Reaktion, so wie von manch anderen fragenden hier ;)
mfg
Tachchen!
Also mal weiter im Text. Ein bisserl dümmer kann ich sicher noch aussehen. ;-)
Mein Ergebnis - sicher höchst unelegant - wäre bislang folgendes:
$dir = './galerien';
$files = scandir($dir, 1);
$_Liste = '';
foreach($files as $_Schluessel => $_Wert)
{
$_Liste .= "<li><a href='" . "$_Schluessel = $_Wert" ."'>" . "$_Schluessel = $_Wert" . "</a></li>\n";
}
echo $_Liste;
Dabei stellen sich für mich einige Fragen:
1. $_Liste = ''; gibt es ausschließlich, damit man hinterher $_Liste
nutzen kann? Bewirkt '' irgendwas?
2. Ich verstehe auch nach x-fachem Lesen des Abschnitts in selfphp nicht,
was $_Schluessel = (oder =>) $_Wert mir sagen sollen/wollen?
3. Im Ergebnis habe ich aber vor allem in dem Array jeweils eine
"Nummerierung" (das ist bestimmt mehr als das, aber was?), wenn ich
den Array durch scandir erhalte und ihn nicht händisch vorher herstelle.
Was macht diese "Nummerierung" ... und wie bekomme ich sie aus meiner
Ausgabe heraus?
Gruß
Die schwarze Piste
Hi,
- $_Liste = ''; gibt es ausschließlich, damit man hinterher $_Liste
nutzen kann? Bewirkt '' irgendwas?
Damit wir die Variable $Liste mit einem Leerstring initialisiert. An diesen Leerstring wird dann nachher in der Schleife das HTML für die einzelnen LI angehängen.
An eine zuvor nicht deklarierte Variable kannst du nichts anfügen - das würde PHP auch mit einer entsprechenden Warnung quitieren.
Der Leerstring ist zwar immer noch "nichts" - aber ein definiertes Nichts, und kein unbestimmtes.
- Ich verstehe auch nach x-fachem Lesen des Abschnitts in selfphp nicht,
was $_Schluessel = (oder =>) $_Wert mir sagen sollen/wollen?
Meinst du in der foreach-Schleife?
Das erste Argument einer foreach-Schleife ist das, worüber du iterieren willst (meistens ein Array).
Jetzt brauchst du innerhalb der Schleife aber auch noch einen Bezeichner, über den du auf das aktuelle Element zugreifen kannst - den gibst du mit as an.
foreach($arrayVariable as $Wert) { ... }
Wenn du nicht nur mit jedem Wert was machen willst, sondern auch noch an dem Index, unter dem dieser Wert im Array hinterlegt ist, interessiert bist - dann nutzt du die erweiterte Syntax:
foreach($arrayVariable as $Schluessel => $Wert) { ... }
- Im Ergebnis habe ich aber vor allem in dem Array jeweils eine
"Nummerierung" (das ist bestimmt mehr als das, aber was?),
Das ist einfach der nummerische, fortlaufende Index des Arrays.
Wenn du ein Array mit
$arrayVariable = array("abc", "def", "ghi");
anlegst - dann nummeriert PHP die Elemente automatisch, mit 0 beginnend.
Wenn du das mittel print_r() zur Kontrolle ausgeben lässt, dann bekommst du folgendes zu sehen:
Array
(
[0] => abc
[1] => def
[2] => ghi
)
Die Ziffern von 0 bis 2 sind der nummerische Index, über den du gezielt auf einzelne Elemente des Arrays zugreifen kannst.
echo $arrayVariable[1]; // wird def ausgeben
Was macht diese "Nummerierung" ... und wie bekomme ich sie aus meiner
Ausgabe heraus?
Wenn du innerhalb deiner foreach-Schleife gar nicht am Index interessiert bist - dann kannst du die einfache Syntax nutzen, in der dir der Index gar nicht zur Verfügung gestellt wird.
In deinem Beispielcode hast du die erweiterte Syntax gewählt, die auch den Schlüsselwert (Index) liefert - und ausserdem gibst du den Wert dieses Schlüssels auch noch in dem HTML-Code, den du dynamisch erzeugst, mit aus.
MfG ChrisB
Tachchen!
Ich sage danke schön an euch und werde im Laufe des Abends mal schauen,
was man da noch so optimieren kann. Am Ende müssen ja auch noch die
Elternverzeichnisse aus der Liste raus und sowas.
Und wenn ich groß bin, werde ich auch Arays & Co verstehen ... und ihr
habt den Grundstein gelegt. ;-)
Gruß
Die schwarze Piste
hi,
Am Ende müssen ja auch noch die
Elternverzeichnisse aus der Liste raus und sowas.
Das kannst du -- wer hätte das gedacht -- auch mit einem Array lösen ;)
$_notallowed = array('.', '..', 'index.php', 'php.ini', 'config_dir');
foreach($_Dir as $_dval) // Array durchlaufen
{
/*
* um Verzeichnisse aufzulisten 'is_file()' durch 'is_dir()' ersetzen
*/
if (is_file("$_rootdir/$_dval")
AND !in_array($_dval, $_notallowed)) // hier wird gegen das oben geschriebene Array geprüft
{
$_dirlist .= sprintf('<li><a href="/%s/%2$s">%2$s</a></li>' . "\n"
, $_rootdir // ersetzt %s zwischen den '/'
, $_dval // ersetzt die zwei '%2$s'
);
}
}
Du musst da eh noch ein Paar Prüfungen einbauen, Bspw. ob 'dir' auch ein Verzeichnis ist und ob es sich scannen lässt, bevor du in die schleife gehst.
mfg
hi,
Apropos:
Und wenn ich groß bin, werde ich auch Arays & Co verstehen ... und ihr
habt den Grundstein gelegt. ;-)
http://forum.de.selfhtml.org/archiv/2008/4/t170302/#m1113099 -- gar nicht mal so lange her, mein erstes mal ;)
Ich könnt den Christoph knutschen, so oft wie der mich schon auf die richtige Bahn ge[schubst|boxt] hat ;))
mfg
hi,
Also mal weiter im Text. Ein bisserl dümmer kann ich sicher noch aussehen. ;-)
Immerhin hast du es zum laufen gekriegt, ist doch schon mal was ;)
$dir = './galerien';
$files = scandir($dir, 1);
/*
Hier wird $_Liste initialisiert, damit später mit dem '.=' dieser Variable Werte angehangen werden
können -- wenn du in der schleife das Punkt vor dem '=' wegmachst, siehst du, was ich meine
*/
$_Liste = '';
/*
Hier sagen wir der Schleife, wie wir das Array gerne hätten
Das ist ein einfaches Array mit jeweils Key und Value, also
array($_Schluessel => $_Wert);
In der Schleife können wir dann bei jedem durchlauf auf jeweils Key und Value zugreifen,
und wenn du eins nicht möchtest, dann lässt du es einfach weg ;)
Foreach sagt Quasi: durchlaufe(Array als Schlüssel und Key)
und so stehen die Werte dann in der Schleife zur verfügung
*/
foreach($files as $_Schluessel => $_Wert) // das muss so bleiben, damit die Schleife arbeiten kann
{
// Die Schlüssel brauchen wir hier nicht, die legt PHP Intern an, damit die Werte
// eindeutig identifizierbar sind
$_Liste .= sprintf('<li><a href="/%s/%2$s">%2$s</a></li>' . "\n"
, $dir // ersetzt %s zwischen den '/'
, $_Wert // ersetzt die zwei '%2$s'
);
}
echo $_Liste;
- $_Liste = ''; gibt es ausschließlich, damit man hinterher $_Liste
nutzen kann? Bewirkt '' irgendwas?
Nein, das bewirkt nichts, die Variable wird lediglich initialisiert -- aber man kann im Script beim echo-Aufuf prüfen, ob Liste Leer ist, wenn ja, dann gibt es eine Fehlermeldung.
- Ich verstehe auch nach x-fachem Lesen des Abschnitts in selfphp nicht,
was $_Schluessel = (oder =>) $_Wert mir sagen sollen/wollen?
Das ist einfach nur eine zuweisung des Wertes zu einem Schlüssel:
array($_Schluessel => $_Wert)
ist Quasi das gleiche wie
array('Name' => 'Malcolm')
Lass dich nit vom '=>' beirren, dass gehört einfach zum Array.
Du kannst auch ein array so schreiben: array('Mann','Frau','Kind','Tier');
- Im Ergebnis habe ich aber vor allem in dem Array jeweils eine
"Nummerierung" (das ist bestimmt mehr als das, aber was?),
Durch die Nummerierung wird jeder Wert im Array identifizierbar, so kannst du auch ohne schleife auf die Werte (sofern dir die Schlüssel bekannt sind) zugreifen, nehmen wir mal als Beispiel:
$_myfirstarray = array(
0 => 'schwarze'
,1 => 'Piste'
,2 => 'Fotograf'
);
echo $_myfirstarray[1]; // gibt 'Piste' aus
wenn ich den Array durch scandir erhalte und ihn nicht händisch vorher herstelle.
Was macht diese "Nummerierung" ...
Die Nummerierung durch scandir() nimmt PHP vor, die ist Ok und gewollt, du musst den Schlüssel nur aus der Schleife raushalten, s. O.
mfg
Kann mich da mal jemand in die Richtung einer Lösung schubsen? Danke!
PHP stellt Reihnungsfunktionen für Arrays zur Verfügung - die bekannteste dürfte sort() sein.
Hello,
PHP stellt Reihnungsfunktionen für Arrays zur Verfügung - die bekannteste dürfte sort() sein.
also DAS Wort musst ich erstmal bei Google eingeben.
Aber da kommt auch nur
Meinten Sie: Reinigungsfunktion Die ersten 2 angezeigten Ergebnisse
Aus welcher Sprache stammt der Begriff? ;-)
Liebe Grüße aus dem schönen Oberharz
Tom vom Berg
Aus welcher Sprache stammt der Begriff? ;-)
Obersüdostbayerisch :p
Das zusätzliche N ist geschenkt.
Hello,
*grummel*
Aktuell möchte ich eine Liste von Links erstellen, die sich automatisch
erstellt aus den jeweils vorhandenen Ordnern in einem "Sammelordner".
Das stelle ich bislang wie folgt an.
Das bedarf einiger Hinweise:
<ul id="galerienliste">
<?php
$ordner = "./galerien";
$erstellen = opendir($ordner);
if($erstellen) ## ist ein belämmerter Bezeichner für ein Verzeichnishandle!
{
#> while ($file = readdir ($erstellen))
$_dir = array();
while (false !==($file = readdir ($erstellen)))
{
if($file != "." && $file != "..") ## die beiden if()s lassen sich zusammenfassen
{
if(is_dir($ordner."/".$file))
{
##> $compl = $ordner."/".$file;
##> echo "<li><a href="".$compl."">".$file."</a></li>\n";
$_dir[] = $ordner."/".$file
}
}
}
closedir($erstellen);
}
echo "<pre>\r\n";
echo htmlspecialchars(print_r($_dir,1));
echo "</pre>\r\n";
?>
</ul>
Dort benenne ich die Ordner nun nach dem Schema Jahr_Monat_Tag.
Das ist weder schön noch besonders elegant, aber es tut am Ende jedenfalls,
was ich gerne hätte.
Nur landet in dieser Liste natürlich der älteste Eintrag oben und der
neuste unten. Ich hätte es aber gerne genau umgekehrt.Kann mich da mal jemand in die Richtung einer Lösung schubsen? Danke!
Trenne Datenhandling (Holen, Verarbeiten, Wegschreiben) von der Visualisierung der Daten
Die Reihenfolge bei readdir() ist keine von der Applikation festgelegte, sondern eine vom OS ausgewürfelte. Die Dateinamen werden so geliefert, wie sie im Filesystem angereiht wurden. Da könnte durchaus auch schon mal eine Lücke gefüllt werden. Kommt eben auf das Filesystem an.
Eine Ordnung erhältst Du nur durch ein Sortierkriterium, dass Du ja in den Namen implementiert hast. Du kannst die Dateien also nach dem Namen sortieren, um Dein Ziel zu erreichen.
Dazu musst Du doch die Namen nur in einem Array sammeln und nicht sofort nach der Beschaffung ausgeben.
Das geht allerdings nur bis zu einer gewissen Anzahl ;-)
Ich hatte neulich das Problemchen mit ca 100.000 Dateien, deren Daten nach Görße und Namen sortiert ausgegeben werden sollten. Da gerät man dann schon leicht an die Speichergrenze von PHP auf typischen Installationen.
und schau Dir auch mal die Funktion glob() an.
http://de2.php.net/manual/en/function.glob.php
die macht das, was Du willst, schon fast automatisch.
Liebe Grüße aus dem schönen Oberharz
Tom vom Berg