Puedes probar con:
Código PHP:
$nombre_sin_espacios = str_replace( ' ', '_', $nombre_original );
explode te devolvería un array de cadenas, para el nombre que propusiste "mi foto.jpg" con esta instrucción:
Código PHP:
$nombre_separado = explode( ' ', $nombre_original );
obtendrías 'mi' en $nombre_separado[0] y 'foto.jpg' en $nombre_separado[1].
Esto lo podrías unir así:
Código PHP:
$nombre_sin_espacios = implode( '_', $nombre_separado );
Saludos,
JJ (Geo).