2011-01-22 14 views
5

Tengo un script. Recibe una variable llamada $ node, que es una cadena; por ahora, supongamos que el valor de la variable es "NODEVALUE". Cuando se llama al script, toma la variable $ node e intenta encontrar una imagen llamada NODEVALUE.png. Si no puede encontrar esa imagen, luego busca NODEVALUE.jpg, si no puede encontrar que busca NODEVALUE.gif ... y después de todo eso, todavía no puede encontrar, devuelve RANDOM.png.¿Existe archivo múltiple de comprobación? ¿Una mejor manera?

En este momento estoy haciendo esta secuencia de comandos de la siguiente manera:

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

Tiene que haber una manera mejor que esto ... Alguien tiene alguna idea?

Respuesta

1

bien ... esto es lo que finalizó el:

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

Alternativas:

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

Esto devuelve una lista de nombres de archivo que comienzan con $ nodo y con un .jpg, .png o .gif sufijo.

Si el directorio contiene muchas entradas, si puede ser más rápido de usar glob() primero:

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

El preg_grep() puede también ser reemplazado por

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

O con un bucle:

$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

Lo que pasa con esto es que estoy preocupado por el rendimiento ... array_filter sería ejecutar la función file_exist en cada resultado. Si el primer resultado funciona, no hay razón para ejecutar los otros resultados ... es solo un desperdicio de recursos. –

+0

Bien ... el ciclo que hiciste al final es perfecto. Excepto que simplemente lo cambié a 'if (file_exists (stuff)) {$ img = stuff; descanso; } 'todo lo demás es solo redundante. –

2

La forma más compacta (y por lo tanto no recomendada) sería:

if (array_sum(array_map("file_exists", array($fn1, $fn2, $fn3)))) { 

Podría ser adaptado para volver también el nombre de archivo encontrado usando array_search:

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

Apenas legible. Tenga en cuenta que también requiere un mapa como array("$node.png"=>"$node.png", "$node.gif"=>"$node.gif", ...). Entonces no sería mucho más corto.

+0

Lo que pasa es que me preocupa el rendimiento ... array_map ejecutaría la función file_exist en cada resultado. Si el primer resultado funciona, no hay razón para ejecutar los otros resultados ... es solo un desperdicio de recursos. –

+0

@JasonAxelrod, de hecho es un desperdicio de procesamiento. Sin embargo, no estoy seguro si es un impacto medible en el rendimiento. Debería probarlo con xdebug/cachegrind. Si se trata de una condición comprobada con frecuencia, entonces definitivamente debe permanecer con su código original. – 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

parece que no entendí bien ... ¡pero eso es porque no me explicaste bien! Tienes la función file_exists en tu pregunta, lo que significa que estás comprobando si el archivo existe ... ¿Intentas comprobar si string contiene image.jpg, gif, png o lo que sea y si no lo es devuelve random.png? – DoubleZero

Cuestiones relacionadas