Php: externes Array mit function bearbeiten ?!

Hallo,

ich programmiere gerade was in php,
bin aber eher ein amateur und stehe vor einem problem.

ich arbeite gerade an einer php funktion, welche
mit ordnerbasiert zip files von jpg files ausgibt.

besonderheit ist, das es nur bestimmte ordner sein sollen (siehe script).

die funktion durchsucht rekursiv eine ordnersturktur,
und gibt mir per echo die filenames alle sauber aus.
nun möchte ich die filenames an ein aaray übergeben,
welches außerhalb der function liegt.
da ich die ordnerdurchsuch funktion jedoch rekursiv nutze,
kann ich die outputs auch icht mit einem return machne da sonst di funktion ja aufhört :confused:

das ecterne array soll dann portionsweise inhalt
an eine zipfunktion übergeben kann um
ordnerbasiert zip-files zu erhalten.
(in den gesuchten ordner liegen immer 32 jpgs)

für jeden hinweis wäre ich sehr dankbar!
besten gruß,
marc

CODE:

<?php #############################################################################################################
# required functions // trims off x chars from the front of a string // trims off y chars from the end of a string // replace "" by "" function trimString( $x, $y, $str ) { $edit = substr( $str, $x ); $edit1 = substr( $edit, 0, strlen( $edit ) - $y ); $return = str\_ireplace('','',$edit1); return $return; } // returns true if $str begins with $sub function beginsWith( $str, $sub ) { return ( substr( $str, 0, strlen( $sub ) ) == $sub ); } // return tru if $str ends with $sub function endsWith( $str, $sub ) { return ( substr( $str, strlen( $str ) - strlen( $sub ) ) == $sub ); } ############################################################################################################# # MAIN SCRIPT ############################################################################################################# // SETTINGS $fileDir = './SHAKE\_IMAGES/'; ############################################################################################################# // READOUT-DIRs - COLLECT FILEPATHs to an ARRAY $i=0; // schleifen-count $filearray = array("Banane","Apfel"); function getDirectory( $path = '.', $level = 0 ){ $ignore = array( 'cgi-bin', '.', '..', 'Step\_01', 'Step\_02', 'Thumbs.db', '.DS\_Store' ); // Directories to ignore when listing output. $dh = @opendir( $path ); // Open the directory to the handle $dh while( false !== ( $file = readdir( $dh ) ) ){ // Loop through the directory if( !in\_array( $file, $ignore ) ) // Check that this file is not to be ignored { if( is\_dir( "$path/$file") ) { // Its a directory, so we need to keep reading down... if( is\_dir( "$path/$file") && endsWith($file, "1150x423")) { #echo "**$file -\> folder matched 1150x423 resolution "; echo " directorylevel = $level "; getDirectory( "$path/$file", ($level+1) ); // Re-call this same function but on a new directory. // this is what makes function recursive. } elseif( is\_dir( "$path/$file") && endsWith($file, "2300x846")) { #echo "$file -\> folder matched 2300x846 resolution "; echo " directorylevel = $level "; getDirectory( "$path/$file", ($level+1) ); // Re-call this same function but on a new directory. // this is what makes function recursive. } else { echo "$file "; echo " directorylevel = $level "; getDirectory( "$path/$file", ($level+1) ); // Re-call this same function but on a new directory. // this is what makes function recursive. } } elseif ($level==3 && endsWith( $file, ".jpg" )) // $levels == 3 verhindert jpgs aufzunehmen die in überordnern vorkommen { echo "$file "; // Just print out the filename array\_push($filearray, $file); $i++; } } } #return($filearray); closedir( $dh ); // Close the directory handle } getDirectory($fileDir); array\_push($filearray, "peter"); echo " "; echo "ARRAY-CONTENT: "; for($e=0;$e";} foreach($filearray as $key =\> $value) { echo " "; print\_r("".$filearray[$key]." - ".$value." - ".$files[$key]." - ".$files[$value]); echo " "; } ############################################################################################################# // ZIPPING-FILES from Array // Archivklasse einbinden: require\_once ('archive.php'); // Objekt erzeugen. Das Argument bezeichnet den Dateinamen $zipfile= new zip\_file('test/Zipdatei.zip'); // Die Optionen $zipfile-\>set\_options(array ( # 'name' =\> "peter", 'storepaths' =\> "0", 'basedir' =\> "/", // Das Basisverzeichnis. Sonst wird der ganze Pfad von / an im Zip gespeichert. 'followlinks' =\> 0, // Symlinks sollen berücksichtigt werden 'inmemory' =\> 0, // Die Datei nur im Speicher erstellen 'level' =\> 9, // Level 1 = schnell, Level 9 = gut 'overwrite' =\> 1,// rw 'prepend' =\> "", // ordnerstruktur innerhalb der zip file erstellen e.g. "blub/bla/" -\> extracts to blub/bla/files.x 'recurse' =\> 1, // In Unterverzeichnisse wechseln // Wenn zu grosse dateien verarbeitet werden, kannes zu einem php memory error kommen // Man sollte nicht über das halbe memory\_limit (php.ini) hinausgehen 'maxsize' =\> 12\*1024\*1024 // Nur Dateien die add\_files(array("SHAKE\_IMAGES/Vito\_Kawa\_A1\_LH1/C01\_Brillantsilber/JPEG\_aus\_Shake\_1150x423/\*.jpg")); // Archiv erstellen #$zipfile-\>create\_archive(); ?\> ############################################################################################################### ############################################################################################################### ############################################################################################################### ############################################################################################################### gibt mir folgendes aus: "..." Vito\_Kawa\_A1\_LH1 directorylevel = 0 C01\_Brillantsilber directorylevel = 1 directorylevel = 2 Vito\_Kawa\_A1\_LH1\_C01\_Brillantsilber\_001.jpg Vito\_Kawa\_A1\_LH1\_C01\_Brillantsilber\_002.jpg Vito\_Kawa\_A1\_LH1\_C01\_Brillantsilber\_003.jpg Vito\_Kawa\_A1\_LH1\_C01\_Brillantsilber\_004.jpg Vito\_Kawa\_A1\_LH1\_C01\_Brillantsilber\_005.jpg Vito\_Kawa\_A1\_LH1\_C01\_Brillantsilber\_006.jpg . . . Vito\_Kawa\_A1\_LH1\_C01\_Brillantsilber\_032.jpg "..." ARRAY-CONTENT: Banane Apfel peter sdfsdf Banane - Banane - - Apfel - Apfel - - peter - peter - - sdfsdf - sdfsdf - - - - - ############################################################################################################### ############################################################################################################### ############################################################################################################### ############################################################################################################### ich kann das array bearbeiten, ausßerhalb der funktion, aber nicht innerhalb der funktion, was ist den falsch ? thx in advance.**

Hallo,
Leider kann ich dir da nicht weiterhelfen!

Dein Code sieht soweit ganz gut aus, ich wäre der Meinung das müsste so klapen.

Ich kann mir das nicht so ganz erklären, da es in php definitiv möglich ist aus einer Funktion heraus auf Variablen der selben Datei zuzugreifen!

Vielen dank für deine Mühe,
umittlerweile konnte ich den Fehler finden und behoeben,
doch konnte ich diesen Eintrag nicht mehr löschen oder selbst beantworten.

Hier für alle:

Der Fehler liegt direkt vor dem array_push.
Das gilt nicht für neue Funktionen und muss deswegen global gemacht werden.
Um es editierbar zu machen, lädt man mit „global $arraynamehier;“
das array in die Funktion. Danach geht auch ein Array_push erfolgreich.

Anbei der komplette Code, der jetzt funktioniert.
Bei Ausführen durchsucht er rekursiv einen angegebenen Ordner,
bis er auf Ordner stößt, die „1150x423“ oder „2300x846“ im Ordnernamen enthalten, und wenn, dann listet es alle „.jpg“-files in diesem Ordner auf, und gibt sie an ein array weiter.
Aus diesen Informationen wird ein individueller zip-file-name erstellt,
in dem alle befindlichen jpg’s aus dem Ordner gezippt werden.

##############################################################

<?php #############################################################################################################
# required functions // trims off x chars from the front of a string // trims off y chars from the end of a string // replace "" by "" function trimString( $x, $y, $str ) { $edit = substr( $str, $x ); $edit1 = substr( $edit, 0, strlen( $edit ) - $y ); $return = str\_ireplace('//','/',$edit1); return $return; } // returns true if $str begins with $sub function beginsWith( $str, $sub ) { return ( substr( $str, 0, strlen( $sub ) ) == $sub ); } // return tru if $str ends with $sub function endsWith( $str, $sub ) { return ( substr( $str, strlen( $str ) - strlen( $sub ) ) == $sub ); } ############################################################################################################# # MAIN SCRIPT ############################################################################################################# // SETTINGS $fileDir = './SHAKE\_IMAGES/'; ############################################################################################################# // READOUT-DIRs - COLLECT FILEPATHs to an ARRAY $i=0; // schleifen-count $filearray = array(); $zipfilenameARRAY = array(); function getDirectory( $path = '.', $level = 0 ){ $ignore = array( 'cgi-bin', '.', '..', 'Step\_01', 'Step\_02', 'Thumbs.db', '.DS\_Store' ); // Directories to ignore when listing output. $dh = @opendir( $path ); // Open the directory to the handle $dh while( false !== ( $file = readdir( $dh ) ) ){ // Loop through the directory if( !in\_array( $file, $ignore ) ) // Check that this file is not to be ignored { if( is\_dir( "$path/$file") ) { // Its a directory, so we need to keep reading down... if( is\_dir( "$path/$file") && endsWith($file, "1150x423")) { #echo "**$file -\> folder matched 1150x423 resolution "; #echo " directorylevel = $level "; getDirectory( "$path/$file", ($level+1) ); } elseif( is\_dir( "$path/$file") && endsWith($file, "2300x846")) { #echo "$file -\> folder matched 2300x846 resolution "; #echo " directorylevel = $level "; getDirectory( "$path/$file", ($level+1) ); } else { #echo "$file "; #echo " directorylevel = $level "; getDirectory( "$path/$file", ($level+1) ); } } elseif ($level==3 && endsWith( $file, ".jpg" )) // $levels == 3 verhindert jpgs aufzunehmen die in überordnern vorkommen { #echo "$file "; // Just print out the filename #if ( !is\_array($filearray) ) $filearray= array(); #array\_push($myArray, $myElement); $pathfile = "$path/$file"; $pathfile = trimString(2,0,$pathfile); $pathfile = dirname($pathfile); #echo "$pathfile "; $zipfilenameEXT = substr($path, -8); $zipfilename = trimString(0,7,$file); $zipfilename .= $zipfilenameEXT; $zipfilename .= ".zip"; #echo "$zipfilename "; global $zipfilenameARRAY; array\_push($zipfilenameARRAY, $zipfilename); global $filearray; array\_push($filearray, $pathfile); #$i++; #echo "array++"; #echo " i: $i "; #$wayofscript = $path; #echo "file: $wayofscript "; } } } #return($filearray); closedir( $dh ); // Close the directory handle } getDirectory($fileDir); $b = sizeof($filearray); echo "Es wurden $b Bilder gefunden. "; echo "Daraus werden insgesamt ".($b/32)." ZIP-files erstellt: "; for($x=0;$x"; // Archivklasse einbinden: require\_once ('archive.php'); // Objekt erzeugen. Das Argument bezeichnet den Dateinamen $zipfile= new zip\_file("test/$zipfilenameARRAY[$x]"); // Die Optionen $zipfile-\>set\_options(array ( 'storepaths' =\> "0", 'basedir' =\> "/", // Das Basisverzeichnis. Sonst wird der ganze Pfad von / an im Zip gespeichert. 'followlinks' =\> 0, // Symlinks sollen berücksichtigt werden 'inmemory' =\> 0, // Die Datei nur im Speicher erstellen 'level' =\> 9, // Level 1 = schnell, Level 9 = gut 'overwrite' =\> 1,// rw 'prepend' =\> "", // ordnerstruktur innerhalb der zip file erstellen e.g. "blub/bla/" -\> extracts to blub/bla/files.x 'recurse' =\> 1, // In Unterverzeichnisse wechseln // Wenn zu grosse dateien verarbeitet werden, kannes zu einem php memory error kommen // Man sollte nicht über das halbe memory\_limit (php.ini) hinausgehen 'maxsize' =\> 12\*1024\*1024 // Nur Dateien die add\_files("archive.php"); $zipfile-\>add\_files(array("$filearray[$x]/\*.jpg")); // Alle ".tmp" dateien in Stuff ausschliessen #$zipfile-\>exclude\_files("htdocs/\*.tmp"); // Archiv erstellen $zipfile-\>create\_archive(); echo "finished: $zipfilenameARRAY[$x] "; } } ?\>**

Hallo Marc,
da kann ich leider nicht helfen.
Trotzdem viel Erfolg,
Michael