2008-10-20 11 views
5

Quelle est la meilleure façon de formater ceci pour la lisibilité?Formatage d'une instruction if pour la lisibilité

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

Répondre

17

Je voudrais extraire la logique "est une image" dans sa propre fonction, ce qui rend le if plus lisible et vous permet également de centraliser la logique.

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

Au-delà de ce que j'ai demandé, merci pour l'aide! – 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

est-il une raison particulière de mettre le || Les OR à la fin de la ligne et les && ET au début? – nickf

+0

@nickf: Si je devais deviner, il s'agit de ne pas mélanger les parens, mais fait plus de mal que de bien. – eyelidlessness

1

Je le casser comme ça, mettre de côté la question de la redondance:

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 réponse porte sur la redondance bien.

+0

+1 pour la réponse simple que je recherchais à l'origine. – PHLAK

2

Le file_exists contrôle semble être constante pour chacun des types de fichiers, alors ne les compare pas à moins que le chèque file_exists a été adoptée.

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

Ne voudriez-vous pas faire l'inverse parce que file_exists serait plus cher? –

+0

@Neil: Cela dépend de la fréquence à laquelle les tests ont échoué. Je doute que les tests strpos() échouent souvent, donc ils ne vont pas réduire le nombre de tests sur file_exists(). Cependant, le test file_exists() échouera si une vignette a déjà été générée, en ignorant les tests de nom de fichier. –

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

Après extraction de la logique à une fonction séparée, vous pouvez réduire la duplication:

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 n'est pas un bon nom - est-ce qu'une valeur de retour de true signifie qu'elle existe ou n'existe pas? Peut-être que is_existing_thumbnail() ou non_existent_thumbnail() serait un meilleur nom - le premier nécessite d'inverser la logique, bien sûr. –

2

Je les séparer ifs comme il y a un code de répétition là-dedans. Aussi, j'essaie de quitter une routine le plus tôt possible:

+0

Je suis d'accord avec la sortie d'une routine dès que possible, je pense que je vais le faire. – PHLAK

1

Je trouve que ce qui suit est plus lisible avec getimagesize(). J'écris ceci de haut en bas de la tête, donc cela peut nécessiter un débogage.

Le code vertical est plus lisible que l'horizontale, 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(...); 

    } 

} 

Paix + joyeux piratage.

1

pourrait tout aussi bien jeter mes deux cents.

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