2011-01-22 3 views
5

Ho una sceneggiatura. Riceve una variabile chiamata $ node, che è una stringa; per ora, assumiamo che il valore della variabile sia "NODEVALUE". Quando viene chiamato lo script, prende la variabile $ node e prova a trovare un'immagine denominata NODEVALUE.png. Se non riesce a trovare quell'immagine, controlla NODEVALUE.jpg, se non riesce a trovare NODEVALUE.gif ... e, dopo tutto, non riesce a trovare, restituisce RANDOM.png.Il controllo di più file esiste? Un modo migliore?

In questo momento sto facendo questo script come segue:

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

Ci deve essere un modo migliore di questo ... Qualcuno ha qualche idea?

risposta

1

Va bene ... questo è quello che ho perfezionato in data:

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

Alternative:

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

Questo restituisce un elenco di nomi di file che iniziano con $ nodo e con un .jpg, .png o .gif suffisso.

Se la directory contiene molte voci, se può essere più veloce da usare glob() prima:

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

Il preg_grep() può anche essere sostituito da

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

O con un ciclo:

$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

La cosa di questo è che sono preoccupato per le prestazioni ... array_filter sarebbe eseguire la funzione file_exist su ogni risultato. Se il primo risultato funziona, non vi è alcun motivo per eseguire gli altri risultati ... è solo uno spreco di risorse. –

+0

Okay ... il loop che hai fatto alla fine è perfetto. Tranne che l'ho semplicemente cambiato in 'if (file_exists (stuff)) {$ img = stuff; rompere; } 'tutto il resto è ridontante. –

2

La forma più compatta (e quindi non consigliata) sarebbe:

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

Potrebbe essere adattato anche a restituire il nome del file trovato con array_search:

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

Quasi leggibile. Nota come richiede anche una mappa come array("$node.png"=>"$node.png", "$node.gif"=>"$node.gif", ...). Quindi non sarebbe molto più breve.

+0

La cosa su questo è che sono preoccupato per le prestazioni ... array_map avrebbe eseguito la funzione file_exist su ogni risultato. Se il primo risultato funziona, non vi è alcun motivo per eseguire gli altri risultati ... è solo uno spreco di risorse. –

+0

@JasonAxelrod, è davvero uno spreco di elaborazione. Non sono sicuro che si tratti di un impatto misurabile sulle prestazioni. Dovresti testarlo con xdebug/cachegrind. Se si tratta di una condizione frequentemente verificata, allora si dovrebbe sicuramente rimanere con il codice originale. – 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

cuciture come non ho capito bene ... ma questo perché non hai spiegato bene! Hai la funzione file_exists nella tua domanda che significa che stai controllando se il file esiste ... Quindi stai provando a controllare se la stringa contiene image.jpg, gif, png o altro e se non restituisce random.png? – DoubleZero