2 Stimmen

PHP-Funktion gibt keinen Wert zurück

Ich habe eine Funktion, die bei Angabe eines Dateinamens und eines Verzeichnispfads prüft, ob das Verzeichnis bereits eine Datei mit demselben Namen enthält, und, falls ja, einen geänderten Dateinamen zurückgibt (durch Anhängen einer Zahl nach dem ersten Teil des Dateinamens). (Die Funktion get_filenames() ist eine CodeIgniter-Hilfsfunktion, die ein Array mit allen Dateinamen im angegebenen Verzeichnis erstellt).

Wenn ich versuche, das zurückgegebene Ergebnis des Funktionsaufrufs auszudrucken, erhalte ich nichts; wenn ich jedoch $new_filename in der else{}-Anweisung der Funktion selbst ausdrucke und dann einfach die Funktion aufrufe (anstatt ihren Wert zu drucken), funktioniert es!

Ich muss den Wert in der Funktion zurückgeben, nicht ausdrucken, da ich das Ergebnis eigentlich einer Variablen zur weiteren Verarbeitung zuweisen muss. (Im folgenden Beispiel habe ich nur das Ergebnis des Funktionsaufrufs gedruckt, um den Punkt zu verdeutlichen).

Die Funktion:

function avoid_conflicting_filenames($old_filename, $new_filename, $dir, $count)
{   
    $num = '';
    if ($count > 0):
        $num = $count;
    endif;

    $filename_arr = explode('.', $old_filename, -1);
    $new_filename = $filename_arr[0] . $num . '.' . $filename_arr[1];

    if (in_array($new_filename, get_filenames($dir))):      
        $count++;
        avoid_conflicting_filenames($old_filename, $new_filename, $dir, $count);
    else:
        return $new_filename;
    endif;
}

Und wo ich die Funktion aufrufe:

print avoid_conflicting_filenames('file.jpg', '', 'path/to/file', 0);

Das hat mich in den letzten Tagen in den Wahnsinn getrieben, daher wäre ich für jede Hilfe sehr dankbar! Danke!

10voto

Paolo Bergantino Punkte 465120

Ersetzen Sie dies:

avoid_conflicting_filenames($old_filename, $new_filename, $dir, $count);

Mit diesem:

return avoid_conflicting_filenames($old_filename, $new_filename, $dir, $count);

Sie denken nicht rekursiv darüber nach. Sie müssen den Rückgabewert der Funktion zurückgeben.

Außerdem: Was hat es mit der if-Syntax auf sich? Ich toleriere sie innerhalb von Vorlagen, aber für Code? ew.

Wenn ich den Code richtig verstehe, könnten Sie diese Funktion auch so umschreiben, dass eine Rekursion vermieden wird:

function avoid_conflicting_filenames($old_filename, $new_filename, $dir) {   
    $num = 0;
    $files = get_filenames($dir);
    $filename_arr = explode('.', $old_filename, -1);
    do {
        $new_filename = $filename_arr[0] . $num . '.' . $filename_arr[1];
        $num++;
    } while(in_array($new_filename, $files));
    return $new_filename;
}

Ich denke, das ist schöner und ein bisschen einfacher zu bekommen, aber es liegt an Ihnen...

2voto

eisberg Punkte 3501

Ändern Sie Ihren Code in:

function avoid_conflicting_filenames($old_filename, $new_filename, $dir, $count)
{   
    $num = '';
    if ($count > 0):
        $num = $count;
    endif;

    $filename_arr = explode('.', $old_filename, -1);
    $new_filename = $filename_arr[0] . $num . '.' . $filename_arr[1];

    if (in_array($new_filename, get_filenames($dir))):          
        $count++;
        return avoid_conflicting_filenames($old_filename, $new_filename, $dir, $count);
    else:
        return $new_filename;
    endif;
}

Sie haben den Rückgabewert vergessen, wenn Sie avoid_conflicting_filenames innerhalb von avoid_conflicting_filenames aufrufen.

0voto

Blixt Punkte 48333

Sie führen die Funktion rekursiv aus. Sie müssen das Ergebnis an die "übergeordnete" Instanz der Funktion weitergeben:

if (in_array($new_filename, get_filenames($dir))):          
    $count++;
    // Note "return" statement below.
    return avoid_conflicting_filenames($old_filename, $new_filename, $dir, $count);
else:
    return $new_filename;
endif;

0voto

Kevin Montrose Punkte 21631

Wenn die erste Verzweigung in Ihrem zweiten if genommen wird, kommt die Funktion nie zu einer return-Anweisung.

Ändern Sie den Text in:

if (in_array($new_filename, get_filenames($dir))):          
    $count++;
    //Added return
    return avoid_conflicting_filenames($old_filename, $new_filename, $dir, $count);
else:
    return $new_filename;
endif;

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X