2011-01-22 26 views
5

Bir komut dosyası var. Bir dize olan $ node adlı bir değişken alır; Şimdilik, değişken değerinin "NODEVALUE" olduğunu varsayalım. Komut çağrıldığında, $ node değişkenini alır ve NODEVALUE.png adlı bir görüntü bulmaya çalışır. Bu görüntüyü bulamazsa, NODEVALUE.jpg için denetler, eğer NODEVALUE.gif dosyasını ararsa ... ve sonuçta bulamazsa, RANDOM.png değerini döndürür. Orada varBirden Fazla Dosya Var mı Kontrol Ediyor? En iyi yol?

if (file_exists($img = $node.".png")) { } 
else if (file_exists($img = $node.".jpg")) { } 
else if (file_exists($img = $node.".gif")) { } 
else 
{ 
    $img = 'RANDOM.png'; 
} 

bundan daha iyi bir yol olarak ... Herkes herhangi bir fikir var şu şekildedir:

Şu anda bu senaryoyu yapıyorum?

cevap

1

Tamam ... bu ben kesinleşmiş budur:

$searches = array(
    $folder . "nodes/" . $node . ".png", 
    $folder . "nodes/" . $node . ".jpg", 
    $folder . "nodes/" . $node . ".gif", 
    $folder . "users/" . $user . ".png", 
    $folder . "users/" . $user . ".jpg", 
    $folder . "users/" . $user . ".gif" 
); 

foreach ($searches AS $search) 
{ 
    if (file_exists($search)) 
    { 
     $img = $search; 
     break; 
    } 
} 

if (!$img) 
{ 
    random image generator script... 
} 
3
$list = array_filter(array("$node.png", "$node.jpg", "$node.gif"), 'file_exists'); 
if (!$img = array_shift($list)) { 
    $img = 'RANDOM.png'; 
} 

Alternatifler: Bu .png veya sonek .gif, $ düğüm ile ve bir .jpg ile başlayan dosya adlarının listesini döndürür

$list = scandir("."); 
$list = preg_grep("#".preg_quote($node,'#')."\.(jpg|png|gif)$#", $list); 

.

dizin sayıda giriş içeriyorsa, eğer ilk topak() kullanmak daha hızlı olabilir:

$list = glob("$node.*"); // take care to escape $node here 
$list = preg_grep("#".preg_quote($node,'#')."\.(jpg|png|gif)$#"); 

preg_grep() da

$list = array_intersect($list, array("$node.png", "$node.jpg", "$node.gif")); 

tarafından Veya bir döngü ile değiştirilebilir:

$img = null; 
foreach(array('png','jpg','gif') as $ext) { 
    if (!file_exists("$node.$ext")) continue; 
    $img = "$node.$ext"; break; 
} 
$img = $img ? $img : "RANDOM.png"; 
+0

Bu konuda şey her sonuca file_exist işlevini aday olacağını performans ... array_filter endişeleniyorum olmasıdır. Eğer ilk sonuç işe yararsa, diğer sonuçları yürütmek için bir sebep yoktur ... sadece bir kaynak israfı. –

+0

Tamam ... sonunda yaptığınız döngü mükemmel. Ama ben sadece değiştirdim (if (file_exists (stuff)) {$ img = stuff; break; } 'diğer her şey sadece redunant. –

2

En küçük (ve bu nedenle önerilmez) formu şu olabilir:

Ayrıca array_search kullanılarak bulunan bir dosya adı döndürme için adapte edilebilir
if (array_sum(array_map("file_exists", array($fn1, $fn2, $fn3)))) { 

: Hemen hemen okunabilir

array_search(1, array_map("file_exists", array($fn1=>$fn1, $fn2=>$fn2))) 

. Ayrıca, array("$node.png"=>"$node.png", "$node.gif"=>"$node.gif", ...) gibi bir haritayı nasıl gerektirdiğini unutmayın. Yani o kadar kısa olmazdı.

+0

Bunun hakkında bir şey, performans hakkında endişeliyim ... array_map, her sonuçta file_exist işlevini çalıştırırdı. Eğer ilk sonuç işe yararsa, diğer sonuçları yürütmek için bir sebep yoktur ... sadece bir kaynak israfı. –

+0

@JasonAxelrod, Bu gerçekten bir işlem kaybıdır. Ölçülebilir bir performans etkisi olsa da emin değil. Xdebug/cachegrind ile test etmeniz gerekir. Sık sık kontrol edilen bir durumsa, orijinal kodunuzda kesinlikle kalmalısınız. – mario

2
$n_folder="images/nodes/"; 
$u_folder="images/users/"; 
    $extensions=array(".png",".jpg",".gif"); 

foreach ($extensions as $ext) 
{ 
    if (file_exists($n_folder.$node.$ext)) 
    { 
    $img=$n_folder.$node.$ext; 
    break; 
    } 
    elseif (file_exists($u_folder.$node.$ext)) 
    { 
     $img=$u_folder.$node.$ext; 
    break; 
    } 
} 

if (!$img) 
{ 
    random image generator script... 
} 
+0

dikişleri iyi anlayamadığım gibi ... ama thats çünkü iyi açıklamıyorsun! Dosyanızda file_exists işlevi var demektir, yani dosya var mı diye kontrol edersiniz ... Yani string'in image.jpg, gif, png veya neyse olup olmadığını ve eğer random.png 'i iade etmediğini kontrol etmeye çalışıyorsunuz? – DoubleZero

İlgili konular