CronJob-Service
bei SELFPHP mit ...
|
+ minütlichen Aufrufen
+ eigenem Crontab Eintrag
+ unbegrenzten CronJobs
+ Statistiken
+ Beispielaufrufen
+ Control-Bereich
Führen Sie mit den CronJobs von
SELFPHP zeitgesteuert Programme
auf Ihrem Server
aus. Weitere Infos
|
:: Anbieterverzeichnis ::
Globale Branchen
Informieren Sie sich über ausgewählte Unternehmen im Anbieterverzeichnis von SELFPHP
:: Newsletter ::
Abonnieren Sie hier den kostenlosen
SELFPHP Newsletter!
|
PHP Grundlagen Hier kann über grundlegende Probleme oder Anfängerschwierigkeiten diskutiert werden |
05.09.2007, 14:23:25
|
Junior Member
|
|
Registriert seit: Jun 2004
Beiträge: 473
|
|
AW: Wie Array aufteilen?
Zitat:
Zitat von defabricator
Nicht Dein rumgewurstel sondern das von maiskolben. Also nicht gleich auf den Schlips getreten fühlen, ok?
|
OK...
Zitat:
Zitat von defabricator
Hm, wer macht sich denn hier nun wichtig? Uhhh... jetzt muss sich PHP selbst um die offene Resource kümmern. Das ist ja eine Katastrophe.
|
Ich? nöö....
Ich finde lediglich, dass dieses "PHP wirds am Ende der Skriptausführung schon richten" keine vorteilhafte Einstellung ist...
...und es geht dabei auch nicht um mich, denn egal ob wichtig oder nicht, ich habe es ja gesehen. Es geht um die Art der Kommunikation mit einem, der sich Anfänger nennt.
|
05.09.2007, 14:51:09
|
Senior Member
|
|
Registriert seit: Sep 2007
Ort: Potsdam
Alter: 55
Beiträge: 1.020
|
|
AW: Wie Array aufteilen?
Zitat:
Zitat von Raketenmann
Ich? nöö....
Ich finde lediglich, dass dieses "PHP wirds am Ende der Skriptausführung schon richten" keine vorteilhafte Einstellung ist...
|
Nein, die richtige Aufteilung der Sichtbarkeitsgrenzen + garbage collection (imho eine der drei wichtigsten Errungenschaften beim Entwicklen) werden es in der Regel schon richten. Meine "Lösung" wäre daher nicht das Einfügen von fclose(), sondern das Aufteilen in entsprechende Funktionen. Aber um des lieben Friedens Willen (und weil maiskolben die Diskussion hier erstmal vermutlich wenig bis garnicht interessiert): Sobald die Datensätze eingelesen sind, wird die Dateiresource nicht mehr benötigt und ein flcose() vor usort() in meinem ursprünglichen Skript gibt die Resource früher (oder rechtzeitig, je nach Standpunkt) wieder frei; Resourcen sollten nicht unnötig lange gehalten werden. Danke für den wertvollen Hinweis, Raketenmann ;)
|
05.09.2007, 20:13:40
|
|
Junior Member
|
|
Registriert seit: Aug 2006
Ort: Bremen
Alter: 43
Beiträge: 247
|
|
AW: Wie Array aufteilen?
Zitat:
und weil maiskolben die Diskussion hier erstmal vermutlich wenig bis garnicht interessiert
|
Nein, mich interessiert eure Diskussion über "Welche Dinge kann man bei einem Anfänger voraussetzen", und "der Sinn oder Unsinn von verschiedenen Herangehensweisen"... Doch muss ich einfach sagen, dass mir der Stil von Raketenmann ein wenig mehr einleuchtet. Denn in der Vergangenheit hat er mir durch Hilfestellungen (seine Scripte) einiges an Licht in's Dunkle gebracht, und so habe ich natürlich auch etwas gelernt. Zum Beipiel die preg_match(); Funktion...
Dein Ansatz ist ebenso vernünftig wie der von Raketenmann, und man mag sich darüber streiten, für einfache Umsetzungen Funktionen zu schreiben. Aber davon habe ich keinen richtigen Plan...
Ich danke euch beiden für eure Hilfe, doch möchte ich mir vorbehalten mir auszusuchen (welch ein Luxus!!!) wessen Hilfestellungen ich aufnehme und gebrauche!
Um mal wieder zurück zum Thema zu kommen: Ich bekomme meine Einträge nicht geordnet! Was ich auch anstelle in meiner Unwissendheit!
Ich möchte euch beiden mal das komplette Script zeigen...
PHP-Code:
<?php // Pfade bestimmen (NUR bei _einem_ Index, auf dem Beitraege // aus mehreren Kategorien angezeigt werden sollen!)
$pfadx = array(); $pfadx['n'] = $_SERVER['DOCUMENT_ROOT'] . "/pfad/kategorie1/"; $pfadx['f'] = $_SERVER['DOCUMENT_ROOT'] . "/pfad/kategorie2/"; $pfadx['c'] = $_SERVER['DOCUMENT_ROOT'] . "/pfad/kategorie3/"; $pfadx['r'] = $_SERVER['DOCUMENT_ROOT'] . "/pfad/kategorie4/"; $pfadx['p'] = $_SERVER['DOCUMENT_ROOT'] . "/pfad/kategorie5/";
$pfade = $pfadx; $datei = $pfade . 'index.txt'; foreach($pfade as $pfad) // Pfade als Schleife durchlaufen, und Dateien einlesen { $fp = fopen($pfad . "index.txt", "r"); // Nur die vollen heraussuchen! while(!feof($fp)) { $voll = trim(fgets($fp)); if (strlen($voll)) $zeilen[] = $voll; } fclose($fp); }
$element = array(); $ts_sort = array();
for($z=0;$z<count($zeilen);$z++) { $zeil = explode("|",$zeilen[$z]); if($zeil[0] == '001') { $ts_arr = explode("/",$zeil[1]); $zeil[1] = mktime(0,0,0,$ts_arr[1],$ts_arr[0],$ts_arr[2]);
$ts_sort[] = $zeil[1]; krsort($ts_sort);
$element = $zeil; // Template einbinden und Variablen ausgeben! include ($_SERVER['DOCUMENT_ROOT']) . ('/template.html'); } } ?>
Der Aufruf des Templates muss innerhalb der Schleife kommen, da sonst nur der letzte Inhalt im Array im Template angezeigt wird...
Ist das einiegermaßen plausibel? Es werden mehrere Dateien (index.txt - Zeilenh) aus verschiedenen Ordnern geöffnet (erste Schleife) und in das Array Zeilen geschrieben.
Dann im Script von Raketenmann werden nur die Zeilen mit einer 001 davor in ein Array geschrieben. Das sind dann die Beiträge die auf der Startseite angezeigt werden sollen, sozusagen die wichtigsten Neuigkeiten usw...
Aber, ich bekomme die Beiträge nicht sortiert, doch sitze ich nicht untätig rum und erwarte von euch Hilfe, sondern ich habe echt schon sehr viel herumprobiert...
Ich weiß nicht was das soll - es will sich nicht sortieren lassen...
__________________
Worte haben Macht - nichts...
Geändert von maiskolben (05.09.2007 um 22:38:35 Uhr)
|
05.09.2007, 21:55:41
|
Senior Member
|
|
Registriert seit: Sep 2007
Ort: Potsdam
Alter: 55
Beiträge: 1.020
|
|
AW: Wie Array aufteilen?
Du hast eine Schleife zum Einlesen der Daten
Code:
foreach($pfade as $pfad) // Pfade als Schleife durchlaufen, und Dateien einlesen
{
fopen
while/fgets
$zeilen[]
}
Danach hast Du alle Daten im Array $zeilen. Soweit so gut.
In Deiner zweite Schleife willst Du alles aufeinmal reinpacken: umformen, sortieren und ausgeben. Das geht so nicht, denn schon für die Sortierung brauchst Du alle Datensätze bereits umgewandelt.
Also
- erst die Schleife zum Einlesen
- dann eine Schleife zum Umwandeln der Datenzeilen.
- dann sortieren
- dann eine Schleife zum Ausgaben
Die ersten beiden Punkte kannst Du zusammenfassen.
Und nochmal eine Rückfrage: Kann es mehr als einen Datensatz zu einem Datum geben?
Geändert von defabricator (05.09.2007 um 21:58:30 Uhr)
|
05.09.2007, 22:22:27
|
|
Junior Member
|
|
Registriert seit: Aug 2006
Ort: Bremen
Alter: 43
Beiträge: 247
|
|
AW: Wie Array aufteilen?
Die Antwort ist: ja!
Es gibt zu einem Timestamp manchmal mehrere Zeilen...
Ich habe es, um Himmels willen!!!, jetzt geschafft, dass die Beiträge - fast - nach dem Datum in Form des Timestamps sortiert ausgegeben werden, bzw. in einer extra! Schleife nach dem sortieren ausgegeben werden...
Ich bräuchte einen Timestamp, der etwas genauer ist, nech? Also auch das Datum und die genaue Uhrzeit als $zeile[1]; und daraus den TS machen... ?
hmmm...
Abersoweit so gut!
Danke für die Aufklärung, dass man das nicht alles in einer Schleife machen kann! Hätte ja mal den kompletten Code vorab reinstellen können, ich Idi!
Bis jetzt Stand:
PHP-Code:
<?php /*// Pfade bestimmen (NUR bei _einem_ Index, auf dem Beitraege // aus mehreren Kategorien angezeigt werden sollen!)
$pfadx = array(); $pfadx['n'] = $_SERVER['DOCUMENT_ROOT'] . "/pfad/kategorie1/"; $pfadx['f'] = $_SERVER['DOCUMENT_ROOT'] . "/pfad/kategorie2/"; $pfadx['c'] = $_SERVER['DOCUMENT_ROOT'] . "/pfad/kategorie3/"; $pfadx['r'] = $_SERVER['DOCUMENT_ROOT'] . "/pfad/kategorie4/"; $pfadx['p'] = $_SERVER['DOCUMENT_ROOT'] . "/pfad/kategorie5/";
$pfade = $pfadx; foreach($pfade as $pfad) // Pfade als Schleife durchlaufen { $fp = fopen($pfad . "index.txt", "r"); while(!feof($fp)) { $voll = trim(fgets($fp)); if (strlen($voll)) $zeilen[] = $voll; } fclose($fp); }
*/for($z=0;$z<count($zeilen);$z++) { $zeile = explode("|",$zeilen[$z]); if($zeile[0] == '001') { $datum = explode("/",$zeile[1]); $bz = mktime(0,0,0,$datum[1],$datum[0],$datum[2]); $sortiert[$bz] = $zeile; } }
array_multisort($sortiert);
for($y=0;$y<count($sortiert);$y++) { $element = $sortiert[$y]; // Template einbinden und Variablen ausgeben! include ($_SERVER['DOCUMENT_ROOT']) . ('/template.html'); } ?>
__________________
Worte haben Macht - nichts...
Geändert von maiskolben (05.09.2007 um 22:41:09 Uhr)
|
05.09.2007, 22:47:24
|
Senior Member
|
|
Registriert seit: Sep 2007
Ort: Potsdam
Alter: 55
Beiträge: 1.020
|
|
AW: Wie Array aufteilen?
Du schreibst den Zeitstempel immer noch als Index des Feldes
Zitat:
$bz = mktime(0,0,0,$datum[1],$datum[0],$datum[2]);
$sortiert[$bz] = $zeile;
|
aber dafür hast Du jetzt plötzlich krsort() durch array_multisort() ersetzt, das sich nicht um den Index kümmert. Warum?
Zitat:
Zitat von maiskolben
Ich bräuchte einen Timestamp, der etwas genauer ist, nech? Also auch das Datum und die genaue Uhrzeit als $zeile[1]; und daraus den TS machen... ?
|
a) Du kannst das Eingabeformat ändern? Warum schreibst Du dann anstatt dd/mm/yy nicht gleich einen Zeitstempel in die Dateien?
b) Mit dem Ansatz über Index/krsort wirst Du immer das Problem haben, dass zwei gleiche Zeitstempel sich überschreiben. Wenn Du Stunden, Minuten und Sekunden hinzufügst, verringerst Du das Probelm zwar vielleicht, aber es bleibt im Prinzip bestehen.
Geändert von defabricator (05.09.2007 um 22:47:57 Uhr)
|
05.09.2007, 23:13:09
|
|
Junior Member
|
|
Registriert seit: Aug 2006
Ort: Bremen
Alter: 43
Beiträge: 247
|
|
AW: Wie Array aufteilen?
Hmmm...
Ich habe jetzt folgendes Array...
Zuerst die letzte Schleife:
PHP-Code:
}
}
krsort($sortiert);
for($y=0;$y<count($sortiert);$y++)
{
$element = $sortiert;
// Template einbinden und Variablen ausgeben!
include ($_SERVER['DOCUMENT_ROOT']) . ('/template.html');
print_r($sortiert);
}
HTML-Code:
Array
(
[1188770400] => Array
(
[0] => 001
[1] => 03/09/07
[2] => Überschrift
[3] => text
[4] => text
[5] => text
[6] => textjpg
[7] => text
[8] => text
)
[1187128800] => Array
(
[0] => 001
[1] => 15/08/07
[2] => Überschrift
[3] => text
[4] => text
[5] => text
[6] => text.jpg
[7] => text
[8] => text
)
[1185141600] => Array
(
[0] => 001
[1] => 23/07/07
[2] => Überschrift
[3] => text
[4] => text
[5] => text
[6] => text.JPG
[7] => text
[8] => text
)
)
Bei dem einbinden des Templates bekomme ich die Fehlermeldung, undefined offset.
Wird jetzt das Array nach den Timestamps im Key sortiert, oder ist das auch Unsinn...?
__________________
Worte haben Macht - nichts...
|
05.09.2007, 23:28:55
|
Senior Member
|
|
Registriert seit: Sep 2007
Ort: Potsdam
Alter: 55
Beiträge: 1.020
|
|
AW: Wie Array aufteilen?
Zitat:
Bei dem einbinden des Templates bekomme ich die Fehlermeldung, undefined offset.
|
In der Meldung steht noch mehr. Und das ist der eigentlich interessante Teil. Da steht nämlich, welcher offset/Index erwartet aber nicht gefunden wird.
Zitat:
Wird jetzt das Array nach den Timestamps im Key sortiert, oder ist das auch Unsinn...?
|
Na, ist das Array nu sortiert oder nicht? Was macht krsort?
Ja, es ist nach dem Index (abwärts) sortiert.
Auf jeden Fall beteht noch das Problem
Zitat:
Zitat von defabricator
b) Mit dem Ansatz über Index/krsort wirst Du immer das Problem haben, dass zwei gleiche Zeitstempel sich überschreiben. Wenn Du Stunden, Minuten und Sekunden hinzufügst, verringerst Du das Probelm zwar vielleicht, aber es bleibt im Prinzip bestehen.
|
Ausserdem werden Daten vor dem 9.9.2001 falsch einsortiert. Der Zeitstempel springt da nämlich von 999999999 (9 Stellen) auf 1000000000 (10 Stellen).
Ob ich noch einmal vorsichtig darauf hinweisen darf, dass http://www.selfphp.info/forum/showpo...64&postcount=4 all diese Probleme nicht hat?
Geändert von defabricator (05.09.2007 um 23:29:26 Uhr)
|
05.09.2007, 23:40:09
|
|
Junior Member
|
|
Registriert seit: Aug 2006
Ort: Bremen
Alter: 43
Beiträge: 247
|
|
AW: Wie Array aufteilen?
Ja, dass darfst Du gern, und ich werde mir Dein Script auch mal reinziehen.
Es ist aber ein bekacktes Problem, dass ich gerne in den Griff kriegen würde...
krsort(); sortiert mir in einem 2D Array von hoch absteigend, richtig?
PHP-Code:
for($z=0;$z<count($zeilen);$z++) { $zeile = explode("|",$zeilen[$z]); if($zeile[0] == '001') { $datum = explode("/",$zeile[1]); $bz = mktime(0,0,0,$datum[1],$datum[0],$datum[2]); $sortiert[$bz] = $zeile; } }
// Bis hierhin ist alles richtig. // Ich habe ein 2D Array ($sortiert), mit den Schlüsseln als Timestamp für krsort(); // Nun brauche ich die Augabeschleife...
krsort($sortiert);
// Ausgabeschleife... for($y=0;$y<count($sortiert);$y++) { // Damit die Ausgabe im Template funktioniert, wird hier einfach // das Array nochmal gezählt, und heraufgezählt/heraufdurchlaufend... // Ab hier komme ich nicht mehr weiter, ich komme // über die zweite Dimension nicht raus. $element = $sortiert; // ?
// $element = $sortiert[$bz]; // So habe ich nur den jeweils ersten Beitrag im Array // (also die Zeile aufgeteilt und $element zugewiesen!) // dreimal hintereinander... AHHH!
// Template einbinden und Variablen ausgeben! include ($_SERVER['DOCUMENT_ROOT']) . ('/template.html'); } ?>
Ich hol' mir mal einen Kaffe...
__________________
Worte haben Macht - nichts...
Geändert von maiskolben (05.09.2007 um 23:43:49 Uhr)
|
05.09.2007, 23:45:29
|
Senior Member
|
|
Registriert seit: Sep 2007
Ort: Potsdam
Alter: 55
Beiträge: 1.020
|
|
AW: Wie Array aufteilen?
Zitat:
Zitat von maiskolben
krsort(); sortiert mir in einem 2D Array von hoch absteigend, richtig?
|
Ja, nach dem Index absteigend.
Und Du kannst in einem Feld nicht zweimal den selben Index haben. Zwei Einträge mit dem selben Datum überschreiben sich hier also. Du kannst zwar noch eine weitere Dimension einfügen, um mehrere Datensätze mit dem gleichen Datum zu speichern, aber das macht die Sache noch viel unnötiger komplizierter.
|
Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
|
|
Forumregeln
|
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.
HTML-Code ist aus.
|
|
|
Alle Zeitangaben in WEZ +2. Es ist jetzt 09:38:46 Uhr.
|