Rekursion abbrechen

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