2008-10-20 19 views
5

¿Cuál es la mejor forma de formatear esto para facilitar la lectura?Formateo de una instrucción if para legibilidad

if (strpos($file, '.jpg',1) && file_exists("$thumbsdir/$file") == false || strpos($file, '.gif',1) && file_exists("$thumbsdir/$file") == false || strpos($file, '.png',1) && file_exists("$thumbsdir/$file") == false) { 
    createThumb("$gallerydir/$file", "$thumbsdir/$file",$thumbsize); 
    fwrite($log,date("Y-m-d")." @ ".date("H:i:s")." CREATED: $thumbsdir/$file\n"); 
} 

Respuesta

17

Extraería la lógica "es una imagen" en su propia función, lo que hace que el if sea más legible y también le permite centralizar la lógica.

function is_image($filename) { 
    $image_extensions = array('png', 'gif', 'jpg'); 

    foreach ($image_extensions as $extension) 
     if (strrpos($filename, ".$extension") !== FALSE) 
      return true; 

    return false; 
} 

if (is_image($file) && !file_exists("$thumbsdir/$file")) { 
    createThumb("$gallerydir/$file", "$thumbsdir/$file",$thumbsize); 
    fwrite($log,date("Y-m-d")." @ ".date("H:i:s")." CREATED: $thumbsdir/$file\n"); 
} 
+0

Más allá de lo que pedí, ¡gracias por la ayuda! – PHLAK

4
if ((strpos($file, '.jpg',1) || 
    strpos($file, '.gif',1) || 
    strpos($file, '.png',1)) 
    && file_exists("$thumbsdir/$file") == false) 
{ 
    createThumb("$gallerydir/$file", "$thumbsdir/$file",$thumbsize); 
    fwrite($log,date("Y-m-d")." @ ".date("H:i:s")." CREATED: $thumbsdir/$file\n"); 
} 
+1

hay una razón particular para poner el || ¿Órdenes al final de la línea y && ANDs al inicio? – nickf

+0

@nickf: Si tuviera que adivinar, tiene que ver con no mezclar los parens, pero definitivamente hace más daño que bien. – eyelidlessness

1

Me dividirla como este, dejando de lado la cuestión de la redundancia:

if (strpos($file, '.jpg',1) && file_exists("$thumbsdir/$file") == false 
|| strpos($file, '.gif',1) && file_exists("$thumbsdir/$file") == false 
|| strpos($file, '.png',1) && file_exists("$thumbsdir/$file") == false) { 
    createThumb("$gallerydir/$file", "$thumbsdir/$file",$thumbsize); 
    fwrite($log,date("Y-m-d")." @ ".date("H:i:s")." CREATED: $thumbsdir/$file\n"); 
} 

@Fire Lancer's respuesta aborda también la redundancia.

+0

+1 por la respuesta simple que estaba buscando originalmente. – PHLAK

2

El cheque file_exists parece ser constante para cada uno de los tipos de archivos, por lo que se puede comparar a menos que el cheque file_exists ha sido aprobada.

if (file_exists("$thumbsdir/$file") == false) 
{ 
    if(strpos($file, '.jpg',1) || 
    strpos($file, '.gif',1) || 
    strpos($file, '.png',1) 
    { 
    createThumb("$gallerydir/$file", "$thumbsdir/$file",$thumbsize); 
    fwrite($log,date("Y-m-d")." @ ".date("H:i:s")." CREATED: $thumbsdir/$file\n"); 
    } 
} 
+0

¿No le gustaría hacerlo al revés porque file_exists sería más caro? –

+0

@Neil: Dependerá de la frecuencia con la que fallaron las pruebas. Dudo que las pruebas strpos() fallen a menudo, por lo que no reducirán el número de pruebas contra file_exists(). Sin embargo, la prueba file_exists() fallará cuando ya se haya generado una miniatura, omitiendo las pruebas de nombre de archivo. –

2
function check_thumbnail($file) 
{ 
    return (strpos($file, '.jpg',1) && file_exists("$thumbsdir/$file") == false || 
      strpos($file, '.gif',1) && file_exists("$thumbsdir/$file") == false || 
      strpos($file, '.png',1) && file_exists("$thumbsdir/$file") == false); 
} 

if (check_thumbnail ($file)) { 
    createThumb("$gallerydir/$file", "$thumbsdir/$file",$thumbsize); 
    fwrite($log,date("Y-m-d")." @ ".date("H:i:s")." CREATED: $thumbsdir/$file\n"); 
} 

Después de extraer la lógica de una función separada, se puede reducir la duplicación:

function check_thumbnail($file) 
{ 
    return (strpos($file, '.jpg',1) || 
      strpos($file, '.gif',1) || 
      strpos($file, '.png',1)) && 
      (file_exists("$thumbsdir/$file") == false); 
} 
+1

check_thumbnail no es un buen nombre. ¿Tiene un valor de retorno de verdadero significa que existe o no existe? Tal vez is_existing_thumbnail() o non_existent_thumbnail() sería un nombre mejor; el primero requiere invertir la lógica, por supuesto. –

2

Me separar las FI ya que hay un cierto código de repetición en ese país. También trato de salir de una rutina lo más temprano posible:

if (!strpos($file, '.jpg',1) && !strpos($file, '.gif',1) && !strpos($file, '.png',1)) 
{ 
    return; 
} 

if(file_exists("$thumbsdir/$file")) 
{ 
    return; 
} 

createThumb("$gallerydir/$file", "$thumbsdir/$file",$thumbsize); 
fwrite($log,date("Y-m-d")." @ ".date("H:i:s")." CREATED: $thumbsdir/$file\n"); 
+0

Estoy de acuerdo con salir de la rutina lo antes posible, creo que lo haré. – PHLAK

1

Encuentro lo siguiente para ser más legible usando getimagesize(). Estoy escribiendo esto en la parte superior de mi cabeza por lo que puede requerir alguna depuración.

El código vertical es más legible que horizontal, imho.

// Extract image info if possible 
    // Note: Error suppression is for missing file or non-image 
if (@$imageInfo = getimagesize("{$thumbsdir}/{$file}")) { 

    // Accept the following image types 
    $acceptTypes = array(
     IMAGETYPE_JPEG, 
     IMAGETYPE_GIF, 
     IMAGETYPE_PNG, 
    ); 

    // Proceed if image format is acceptable 
    if (in_array($imageInfo[2], $acceptTypes)) { 

     //createThumb(...); 
     //fwrite(...); 

    } 

} 

Peace + happy hacking.

1

ya los puedes tirar mis dos centavos en.

if(!file_exists($thumbsdir . '/' . $file) && preg_match('/\.(?:jpe?g|png|gif)$/', $file)) { 
    createThumb($gallerydir . '/' . $file, $thumbsdir . '/' . $file, $thumbsize); 
    fwrite($log, date('Y-m-d @ H:i:s') . ' CREATED: ' . $thumbsdir . '/' . $file . "\n"); 
} 
Cuestiones relacionadas