php.de

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

 
 
LinkBack Themen-Optionen Thema bewerten
Alt 15.06.2008, 19:09  
Neuer Benutzer
 
Registriert seit: 06.05.2008
Beiträge: 7
marcus_78 befindet sich auf einem aufstrebenden Ast
Standard [Erledigt] Aktuellstes Datum von Dateien rekursiv ermitteln

Hallo!

Ich möchte das aktuellste Datum von Dateien ermitteln. Dazu habe ich mir ein Skript gebastelt, was auch rekursiv alle Unterordner durchsucht. Das funktioniert auch so weit, d.h. ich kann mir alle Zeitstempel der Dateien ausgeben lassen. Jetzt würde ich gerne in eine Variable das aktuellste Datum schreiben. Das funktioniert aber bisher nicht. Kann mir hierbei bitte jemand helfen??

Hier mein bisheriges Skript:

PHP-Code:
<?php

$arr 
= array();
$i 0;

function 
get_dir ($dir
{
  
$fp=opendir($dir);
  while(
$file=readdir($fp)) 
  {
    
// ist Datei ein Verzeichnis -> rekursiver Aufruf um das Verzeichnis auszulesen
    
if (is_dir("$dir/$file") && $file!="." && $file!=".."
    {
      
get_dir("$dir/$file"); 
    }
    
// ist Datei kein Verzeichnis -> ausgeben
    
else if ((!is_dir("$dir/$file")) && $file!="." && $file!=".."
    {
      
$temp $dir."/".$file;
      
//echo "Datei: ".$dir."/".$file." Erstellt: ".date('j.m.Y, H:i', filemtime($temp))."<br>";
      
$arrDates[] = filemtime($temp);
      
sort($arrDates);
      
$arr[i] = max($arrDates);
      
//echo "i: ".$i."<br>";
      
$i++;
    }
  }
  
closedir($fp);
  echo 
"Test: ".date(' j.m.Y, H:i'max($arrDates))."<br>";

  for (
$x 0$x sizeof($arrDates); ++$x)
  {
    
//$ausgabe = date(' j.m.Y, H:i', current($arrDates));
    
$ausgabe date(' j.m.Y, H:i'$arrDates[$x]);
    echo 
$ausgabe."<br>";
    
next($arrDates);
  }
}

echo 
get_dir("./");
//echo "Test: ".$arr[0]."<br>";

?>
P.S.: In dem Skript sind noch ein paar Zeilen, die natürlich weg können. Ich habe sie nur für meine Tests noch einmal drin gelassen.

Schon mal vielen Dank!
Marcus
marcus_78 ist offline  
Sponsor Mitteilung
PHP Code Flüsterer

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

Alt 15.06.2008, 19:24  
moderatives Dielektrikum
 
Benutzerbild von nikosch
 
Registriert seit: 21.05.2008
Beiträge: 35.989
PHP-Kenntnisse:
Fortgeschritten
nikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunft
Standard

Zielführend: Sortieralgorithmus (String Abwärtssortierung) in Verbindung mit einem geeigneten Datumsformat, bspw. YYYY-mm-dd HH:mm:ss

max funktioniert hier nicht, wohl aber der < Operator. Außerdem mußt Du ja nur mit dem bis dato größten Element vergleichen, nie mit einer Liste von Einträgen.

EDIT
Ich sehe gerade, Du arbeitest mit dem puren timestamp aus filemtime. Dafür ist max natürlich geeignet. Aber wie gesagt, nicht ins Array schreiben sondern immer nur zwei Werte vergleichen und den größten speichern.
__________________
--
One pixel is still too big. Please make it smaller. ASAP.

Initiative Mittelstand.
Die wichtigste Gestaltungsregel im Screendesign ist Pi mal Daumen des Arbeitgebers.
--

Geändert von nikosch (15.06.2008 um 19:28 Uhr).
nikosch ist offline  
Alt 15.06.2008, 20:08  
Neuer Benutzer
 
Registriert seit: 06.05.2008
Beiträge: 7
marcus_78 befindet sich auf einem aufstrebenden Ast
Standard

Ich habe mein Skript einmal bearbeitet und die überflüssigen Zeilen gelöscht. Wenn ich mir jetzt das Ergebnis ausgeben lasse, erhalte ich das:

Test: 14.06.2008, 15:28
Test: 11.11.2007, 13:54
Test: 15.06.2008, 20:01
Test: 0

Wie kann ich den jeweils größten Wert in eine Variable (globale Variable?) schreiben, damit es auch ausserhalb der Funktion verfügbar ist?

PHP-Code:
<?php

$test
=0;

function 
get_dir ($dir
{
  
$fp=opendir($dir);
  while(
$file=readdir($fp)) 
  {
    
// ist Datei ein Verzeichnis -> rekursiver Aufruf um das Verzeichnis auszulesen
    
if (is_dir("$dir/$file") && $file!="." && $file!=".."
    {
      
get_dir("$dir/$file"); 
    }
    
// ist Datei kein Verzeichnis -> ausgeben
    
else if ((!is_dir("$dir/$file")) && $file!="." && $file!=".."
    {
      
$temp $dir."/".$file;
      if (
$test<filemtime($temp))
      {
        
$test=filemtime($temp);
      }
    }
  }
  
closedir($fp);
  echo 
"Test: ".date(' j.m.Y, H:i'$test)."<br>";
}

echo 
get_dir("./");
echo 
"Test: ".$test."<br>";

?>
marcus_78 ist offline  
Alt 15.06.2008, 21:09  
moderatives Dielektrikum
 
Benutzerbild von nikosch
 
Registriert seit: 21.05.2008
Beiträge: 35.989
PHP-Kenntnisse:
Fortgeschritten
nikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunft
Standard

Es geht doch um den Max Wert der gesamten Strukur oder? Arbeite einfach mit einem return.
__________________
--
One pixel is still too big. Please make it smaller. ASAP.

Initiative Mittelstand.
Die wichtigste Gestaltungsregel im Screendesign ist Pi mal Daumen des Arbeitgebers.
--
nikosch ist offline  
Alt 15.06.2008, 21:38  
Neuer Benutzer
 
Registriert seit: 06.05.2008
Beiträge: 7
marcus_78 befindet sich auf einem aufstrebenden Ast
Standard

Das war es. Es funktioniert nun!
Vielen Dank!
Gruß
Marcus
marcus_78 ist offline  
Alt 21.06.2008, 14:12  
Neuer Benutzer
 
Registriert seit: 06.05.2008
Beiträge: 7
marcus_78 befindet sich auf einem aufstrebenden Ast
Standard

Hallo!

Leider hat es doch noch nicht so funktioniert, wie gewünscht.

Ich habe aktuell folgende Funktion:

PHP-Code:
function get_dir ($dir
{
  
$i=0;
  
$fp=opendir($dir);
  while(
$file=readdir($fp)) 
  {
    
// ist Datei ein Verzeichnis -> rekursiver Aufruf um das Verzeichnis auszulesen
    
if (is_dir("$dir/$file") && $file!="." && $file!=".."
    {
      
get_dir("$dir/$file"); 
    }
    
// ist Datei kein Verzeichnis -> ausgeben
    
else if ((!is_dir("$dir/$file")) && $file!="." && $file!=".."
    {
      if(
$i==0)
      {
        
$temp1=date(' j.m.Y, H:i'filemtime($dir."/".$file));
      }
      else if(
$i>0)
      {
        
//echo "Datei: ".$dir."/".$file." --> Datum: ".date(' j.m.Y, H:i', filemtime($dir."/".$file))."<br>";
        
$temp2=date(' j.m.Y, H:i'filemtime($dir."/".$file));      
        echo 
"Datei: ".$dir."/".$file."<br>Temp1: ".$temp1." <-> Temp2: ".$temp2."<br>";
        if(
$temp1<$temp2)
        {
          
$temp1=$temp2;
        }
        echo 
"Max: ".$temp1."<br>";
      }
      
$i++;
    }
  }
  
closedir($fp);
  
//return $temp1;

Ich habe mir ein paar Ausgaben zur Kontrolle eingebaut. Dabei sieht man, dass beim rekursiven Aufruf (d.h. wenn die gefundene Datei ein Verzeichnis ist) immer der aktuelle max-Wert wieder "vergessen" ist und der max-Wert wieder neu ermittelt wird.

Bsp.:

Datei: .//downloads/test1/2.php
Temp1: 14.06.2008, 15:44 <-> Temp2: 14.06.2008, 15:44
Max: 14.06.2008, 15:44
Datei: .//bilder/content.php
Temp1: 11.11.2007, 13:55 <-> Temp2: 24.02.2008, 16:36
Max: 24.02.2008, 16:36
Datei: .//bilder/index.php
Temp1: 24.02.2008, 16:36 <-> Temp2: 10.11.2007, 12:26
Max: 24.02.2008, 16:36
Datei: .//bilder/kurztrips/content.php
Temp1: 16.03.2008, 16:39 <-> Temp2: 16.03.2008, 16:39
Max: 16.03.2008, 16:39
.........

Kann mir bitte hierbei jemand helfen?

Danke & Gruß
Marcus
marcus_78 ist offline  
Alt 22.06.2008, 12:44  
moderatives Dielektrikum
 
Benutzerbild von nikosch
 
Registriert seit: 21.05.2008
Beiträge: 35.989
PHP-Kenntnisse:
Fortgeschritten
nikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunft
Standard

Zitat:
Zitat von nikosch77-new Beitrag anzeigen
in Verbindung mit einem geeigneten Datumsformat, bspw. YYYY-mm-dd HH:mm:ss
Timestamp wäre aber auch gegangen. Dein Code ist mir zu unübersichtlich um da mal durchzuschauen. Benutze besser sprechende Variablennamen.

Und get_dir ist nach wie vor kein guter Funktionsbezeichner.
__________________
--
One pixel is still too big. Please make it smaller. ASAP.

Initiative Mittelstand.
Die wichtigste Gestaltungsregel im Screendesign ist Pi mal Daumen des Arbeitgebers.
--
nikosch ist offline  
Alt 22.06.2008, 18:59  
Neuer Benutzer
 
Registriert seit: 06.05.2008
Beiträge: 7
marcus_78 befindet sich auf einem aufstrebenden Ast
Standard

Ich habe den Code jetzt mal bereinigt und versucht ihn besser lesbar zu machen. Ich hoffe es ist gelungen.

PHP-Code:
function get_maxdate($dir
{
  
$i=0;
  
$fp=opendir($dir);
  
$maxdate_old;
  while(
$file=readdir($fp)) 
  {
    
// ist Datei ein Verzeichnis -> rekursiver Aufruf um das Verzeichnis auszulesen
    
if (is_dir("$dir/$file") && $file!="." && $file!=".."
    {
      
get_maxdate("$dir/$file"); 
    }
    
// ist Datei kein Verzeichnis -> ausgeben
    
else if ((!is_dir("$dir/$file")) && $file!="." && $file!=".."
    {
      
// beim ersten Durchlauf die Variable mit dem Timestamp der zuerst gefundenen Datei füllen
      
if($i==0)
      {
        
$maxdate_old=date('d.m.Y, H:i'filemtime($dir."/".$file));
      }
      
// sonst: Timestamps vergleichen und den Max-Wert speichern
      
else if($i>0)
      {
        
$maxdate_new=date('d.m.Y, H:i'filemtime($dir."/".$file)); 
        if(
$maxdate_old $maxdate_new)
        {
          
$maxdate_old=$maxdate_new;
        }
      }
      
$i++;
    }
  }
  
closedir($fp);
  return 
$maxdate_old;

Mein Problem ist die Rekursion. Solange nur Dateien verglichen werden, funktioniert alles wie gewollt. Wird ein Verzeichnis gefunden und die Funktion rekrsiv aufgerufen (um in das Verzeichnis zu springen) wird das aktuellste Datum wieder "vergessen". Kann mir jemand sagen, wie ich es schaffe, auch bei rekusrivem Programmaufruf den aktuellen Max-Wert zu behalten? Zur Zeit vergleicht das Programm nach rekursivem Aufruf wieder mit dem Timestamp der dort gefundenen Datei und nicht mit dem schon vorher ermittelten Wert.

Danke & Gruß
Marcus
marcus_78 ist offline  
Alt 22.06.2008, 21:43  
Moderator
 
Benutzerbild von Chriz
 
Registriert seit: 11.05.2008
Beiträge: 6.268
Chriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer Anblick
Standard

Schau dir doch mal die Zeile an, in der der rekursive Aufruf steht, du verarbeitest den Rueckgabewert ja ueberhaupt nicht.
__________________
"Nuschel ich?" - "Was?"
Chriz ist offline  
Alt 23.06.2008, 12:48  
Erfahrener Benutzer
 
Benutzerbild von lazydog
 
Registriert seit: 02.04.2008
Beiträge: 4.032
lazydog befindet sich auf einem aufstrebenden Ast
Standard

Du brauchst du den letzten Wert ja innerhalb der Funktion erneut. Deshalb musst du ihn auch immer mitgeben, am Anfang einfach 0. Dann wird das Ganze sehr simpel:
PHP-Code:
function get_maxdate($dir$ts) {
    
$fp opendir($dir);
    while (
$file readdir($fp)) {
        if (
$file == "." && $file == "..") {
            continue;
        }
        if (
is_dir("$dir/$file")) {
            
$ts get_maxdate("$dir/$file"$ts);
        }
        else{
            return 
max($tsfilemtime("$dir/$file"));                                    
        }
    }
    
closedir($fp);
}

// Der Aufruf z.B.
echo date('d.m.Y, H:i'get_marxate('.'0)); 
__________________
Gruss
L
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
[Erledigt] Datum nach Jahr,Monat und Tag sortieren Arguss PHP Tipps 2008 6 19.07.2008 10:31
[Erledigt] Datum Ausgabe Mysql krackmoe PHP Tipps 2008 9 10.07.2008 20:33
[Erledigt] Datums Foumulareingabe mit Datebankeintrag Datum vergleichen freakymiky PHP Tipps 2008 1 21.06.2008 15:49
[Erledigt] MSSQL Datum cycap Datenbanken 4 04.06.2008 15:09
[Erledigt] Farbtiefe eines Bildes ermitteln Chrissi PHP-Fortgeschrittene 11 14.05.2008 13:58
Datum von morgen ermitteln! Timer PHP Tipps 2008 7 14.05.2008 09:06
Dateien nach Datum sortieren ddog PHP Tipps 2008 4 09.03.2008 10:11
Datum zwischen zwei Daten ermitteln Phil21 Datenbanken 1 13.02.2008 15:40
Jahrestag ermitteln cyberholic PHP Tipps 2006 4 17.12.2006 12:50
Datum ermitteln SvenLittkowski PHP-Fortgeschrittene 5 30.09.2006 19:46
Vortag ermitteln und ausgeben als Datum??? niffi PHP Tipps 2006 6 20.03.2006 17:20
Kleinstes und größtes Datum ermitteln. solitaer PHP Tipps 2007 4 20.12.2005 15:45
[Erledigt] Datensätze nach Datum (NOW) -14 ermitteln. Datenbanken 10 02.05.2005 16:00

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
filemtime php rekursiv, php datum rekursiv, timestamp datum aus datei vergleichen, filemtime als datum, verzeichnis rekursiv durchsuchen mit datum php, php rekursion änderungsdatum, php daten rekursion, dateien rekursiv ermitteln, ordner mit unterordner auslesen rekursiv php datum größe, php ordner änderungsdatum rekursiv, höchstes datum in einem ordner ermitteln, php ordner rekursiv auslesen größe datum, php rekursiv datum, verzeichnisse rekursiv datum, php datei nach datum ermitteln, php funktion rekursiv datum, php aktuellste datei aus verzeichnis ermitteln, php file get datum der datei ermitteln, php-aktuellste datei in einem verzeichnis ermitteln, datum rekursiv

Alle Zeitangaben in WEZ +2. Es ist jetzt 18:49 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