2009-06-18 2 views
2

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

Когда я пытаюсь распечатать возвращенный результат вызова функции, я ничего не получаю; но если я напечатаю $ 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); 

Это заставило меня сумасшедшим на прошлый день, поэтому любая помощь будет принята с благодарностью! Благодарю.

ответ

10

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

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

Изменить код:

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

Вы забыли обратный Постулаты при вызове avoid_conflicting_filenames внутри avoid_conflicting_filenames.

0

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

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

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

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

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; 
Смежные вопросы