Rekursion abbrechen
am 01.07.2006 20:34:50 von Mirko Schult
Hallo!
Ich habe noch keine Möglichkeit gefunden eine Rekursion ganz
abzubrechen. Mit break (und auch Angabe der Rekusionsstufen) bricht er
nur die aktuelle Stufe ab, aber nicht die ganze Rekursion. Geht sowas?
Ich will einen Verzeichnisbaum durchgehen und beim Finden einer
bestimmten Datei soll die rekursive Funktion komplett abgebrochen werden.
Danke
Mirko
Re: Rekursion abbrechen
am 01.07.2006 23:15:51 von Niels Braczek
Mirko Schult schrieb:
> Ich habe noch keine Möglichkeit gefunden eine Rekursion ganz=20
> abzubrechen. Mit break (und auch Angabe der Rekusionsstufen) bricht er =
> nur die aktuelle Stufe ab, aber nicht die ganze Rekursion. Geht sowas?
> Ich will einen Verzeichnisbaum durchgehen und beim Finden einer=20
> bestimmten Datei soll die rekursive Funktion komplett abgebrochen werde=
n.
Gib einfach immer den Erledigt-Status zurück. Mehr lässt sich ohne Co=
de
nicht sagen.
MfG
Niels
--=20
| http://www.kolleg.de =B7 Das Portal der Kollegs in Deutschland |
| http://www.bsds.de =B7 BSDS Braczek Software- und DatenSysteme |
| Webdesign =B7 Webhosting =B7 e-Commerce =B7 Joomla! Content Management =
|
------------------------------------------------------------ ------
Re: Rekursion abbrechen
am 02.07.2006 00:02:49 von Ulf Kadner
Mirko Schult wrote:
> Ich habe noch keine Möglichkeit gefunden eine Rekursion ganz
> abzubrechen. Mit break (und auch Angabe der Rekusionsstufen) bricht er
> nur die aktuelle Stufe ab, aber nicht die ganze Rekursion. Geht sowas?
> Ich will einen Verzeichnisbaum durchgehen und beim Finden einer
> bestimmten Datei soll die rekursive Funktion komplett abgebrochen werden.
Einfaches Bsp. ohne Beachtung von Errorhandling:
/**
* @return mixed string bei Erfolg, bool FALSE wenn nix gefunden wird
*/
function search( $dir, $searchFile ) {
$d = dir( $dir );
$tmp = null;
while (FALSE !== ($item=$d->read())) {
$tmp = sprintf( "%s/%s", $dir, $item);
if ($searchFile == $item) {
# Abbruchbedingung erfuellt: Suchauftrag erledigt
$d->close();
return $tmp;
}
if (!is_dir($tmp)) continue;
# Verzeichnis = weitere Rekursion noetig
if (FALSE !== ($result=search($tmp,$searchFile))) {
# Suchauftrag erledigt
$d->close();
return $result;
}
}
# Suchauftrag nicht erledigt
$d->close();
return false;
}
also immer schön über den Rückgabewert (v)ermitteln ob Rekursion beendet
ist.
MfG, Ulf
Re: Rekursion abbrechen
am 02.07.2006 18:20:15 von Mirko Schult
Danke!
Ich habs jetzt endlich hinbekommen. Hier noch mal das Ergebnis für den
den es interessiert:
function insert_prod( $dir, $MySQL_DB, $id, $artnr_neu , $odbc_bez,
$odbc_preis)
{
$handle = dir( $dir );
$tmp = null;
while ( FALSE !== ($item=$handle->read()))
{
// *** Aussortieren von /.. und /. ****************************
if (preg_match("=^\.{1,2}$=", $item)) continue;
// ************************************************************
$tmp = sprintf( "%s/%s", $dir, $item);
$bild_name = ereg_replace(".jpg","",$item);
if ($artnr_neu == $bild_name)
{
# Abbruchbedingung erfuellt: Suchauftrag erledigt
echo('TREFFER
');
$handle->close();
return $tmp;
}
if (!is_dir($tmp)) continue;
if (FALSE !== ($id=insert_prod($tmp, $MySQL_DB, $id+1,
$artnr_neu, $odbc_bez, $odbc_preis))) {
# Suchauftrag erledigt
$handle->close();
return $id;
}
}
# Suchauftrag nicht erledigt
$handle->close();
return false;
}
Re: Rekursion abbrechen
am 02.07.2006 19:34:43 von Daniel Fett
Mirko Schult wrote:
> Danke!
>
> // *** Aussortieren von /.. und /. ****************************
> if (preg_match("=^\.{1,2}$=", $item)) continue;
Das mit einer RegEx zu machen ist aber ziemlich übertrieben.
>
> $tmp = sprintf( "%s/%s", $dir, $item);
Eine stinknormale Konkatenation mit . dürfte schneller sein. Sprintf
macht hier IMO keinen Sinn.
> $bild_name = ereg_replace(".jpg","",$item);
Es existieren tatsächlich Funktionen wie str_replace in PHP...
> if ($artnr_neu == $bild_name)
Sehr gut, keine RegEx ;-)
Daniel
--
Zum Thema "Esoterik": http://www.danielfett.de/df_artikel_astrologie
Kleines RegEx-Tutorial: http://www.danielfett.de/df_artikel_regex
Sicherheit in PHP+MySQL: http://www.danielfett.de/df_artikel_sicherheit