2009-06-18 14 views
2

私は、ファイル名とディレクトリパスを指定すると、ディレクトリにすでに同じ名前のファイルが含まれているかどうかをチェックし、修正されたファイル名を返す場合は最初のファイル名の一部)。 (get_filenames()関数は、指定したディレクトリ内のすべてのファイル名の配列を作成するCodeIgniterヘルパ関数です)。PHP関数が値を返さない

返された関数呼び出しの結果を出力しようとすると、何も得られません。しかし、$ new_filenameを関数自体のelse {}文で出力した場合は、関数を(単に値を出力するのではなく)呼び出すだけで動作します。

実際に結果を変数に代入して処理する必要があるため、関数の値を返す必要があります。

機能(下記の例では、私はちょうどポイントを証明するために、関数呼び出しの結果を印刷しました):

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

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

そして私は、関数を呼び出す場所これは過去の日に私を狂気にさせているので、どんな助けでも大歓迎です!ありがとう。

答えて

10

この置き換えます。これにより

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

を:

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

あなたは再帰的にそれについて考えていません。関数の戻り値を返す必要があります。

これまで、if構文は何ですか?私はテンプレートの中でそれを許しますが、コードのために? ew。私はコードを正しく理解していた場合

、あなたもそうのような再帰を避けるために、この機能を書き換えることができます:

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

は、私は、これはよりよいと得るために少し簡単にだと思うが、それはあなた次第ですavoid_conflicting_filenamesの内部avoid_conflicting_filenamesを呼び出すときは、リターンなステートメントを忘れ

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

:...

2
はにあなたのコードを変更し

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

あれば、あなたの第二の最初の分岐が発生した場合関数はreturn文に遭遇することはありません。

それは読むために変更します。

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;