PHP функция не возвращает значение - PullRequest
2 голосов
/ 18 июня 2009

У меня есть функция, которая, учитывая имя файла и путь к каталогу, проверяет, содержит ли каталог уже файл с таким же именем, и, если это так, возвращает измененное имя файла (добавляя число после первой части имени файла). (Функция get_filenames () является вспомогательной функцией CodeIgniter, которая создает массив всех имен файлов в указанном каталоге.)

Когда я пытаюсь распечатать возвращенный результат вызова функции, я ничего не получаю; но если я напечатаю $ new_filename в операторе else {} самой функции, то просто вызову функцию (вместо вывода ее значения), она работает!

Мне нужно возвращать значение в функции, а не печатать его, поскольку мне действительно нужно присвоить результат переменной для дальнейшей обработки. (В приведенном ниже примере я только что напечатал результат вызова функции, чтобы продемонстрировать точку.)

Функция:

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;
}

И где я вызываю функцию:

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

Это сводило меня с ума в течение последнего дня, поэтому любая помощь будет принята с благодарностью! Спасибо.

Ответы [ 4 ]

10 голосов
/ 18 июня 2009

Заменить это:

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

С этим:

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

Вы не думаете об этом рекурсивно. Вы должны вернуть возвращаемое значение функции.

В прошлом, что случилось с синтаксисом if? Я терплю это внутри шаблонов, но для кода? РЭБ.

Если я правильно понимаю код, вы можете также переписать эту функцию, чтобы избежать рекурсии следующим образом:

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;
}

Я думаю, что это лучше и немного легче получить, но решать вам ...

2 голосов
/ 18 июня 2009

Измените свой код на:

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;
}

Вы забыли возвращаемый статус при вызове избежать_конфликтных_файлов внутри имен_собывающих_файлов.

0 голосов
/ 18 июня 2009

Если берется первая ветвь в вашем втором if, функция никогда не встречает оператора возврата.

Измените его следующим образом:

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;
0 голосов
/ 18 июня 2009

Вы запускаете функцию рекурсивно. Вам нужно будет передать результат в «родительский» экземпляр функции:

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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...