2010-01-24 19 views
7

J'écris actuellement une sorte de gestionnaire de téléchargement et je me demandais si cela était possible:

if($ext == ('zip' || 'png')) { echo "Is it possible ?" } 

Il retourne vrai à chaque fois, donc je suppose que ce n'est pas possible. Mais avez-vous une idée de comment je pourrais facilement faire cela? Je veux dire, pas avec beaucoup de "si" ou "commutateur" ...

Merci quand même! :)

Répondre

22

vous pouvez utiliser in_array($ext,array('png','zip','another','more'))

voir ici: http://php.net/manual/en/function.in-array.php

+0

Cela fonctionne aussi, mais est-il plus rapide que regex? – Minishlink

+0

ne pas, dépend probablement du nombre de fois que vous le faites ... de toute façon, c'était la première chose, qui a surgi dans mon esprit :) –

+1

@Minishlink: Les deux est probablement O (n), bien que l'analyse de l'expression régulière et la construction du DFA prend également du temps. – Gumbo

3

Vous pouvez utiliser des expressions régulières, par ex.

if(preg_match("/^(zip|png)$/", $ext) { echo “It is possible!” } 

question connexe: Checking for file-extensions in PHP with Regular expressions

+0

Oh mon dieu, j'ai totalement oublié regex ... Merci !! =) – Minishlink

+6

Cela semble être une mauvaise utilisation de regex, et une mauvaise solution au problème actuel. –

4

Vous pouvez aller avec une déclaration switch-case:

switch($ext) 
{ 
    case 'png': 
    case 'zip': 
     // Will run for both 'png' and 'zip' 
     echo "It is possible"; 
     break; 
    default: 
     echo "unknown extension!"; 
     break; 
} 
+0

Oui, mais je veux faire les mêmes instructions pour toutes les extensions dans $ ext; donc c'est très long avec cette solution ... Merci quand même! :) – Minishlink

+1

Je ne comprends pas. Cet interrupteur fera exactement ce que vous vouliez avec votre code original. Chaque fois que $ ext contient png ou zip, "It is possible" sera affiché. –

+1

@Minishlink Il peut être plus long, mais il est très facile à entretenir. Ne pensez pas que le code court == meilleur code. Il a ses avantages et ses inconvénients. – CodeMonkey

3
if(($ext == 'zip') || ($ext == 'png')) { echo "It's possible." } 
+0

J'ai aussi trouvé cette solution, mais quand j'ai beaucoup d'extensions, c'est assez long à écrire. Merci quand même ! :) – Minishlink

1
if (in_array($ext, array('png', 'zip'))) { 
    echo "Is it possible ?" 
} 

Le tableau pourrait être stocké quelque part, si vous en avez besoin plusieurs fois.

10

if($ext == ('zip' || 'png')) fait la comparaison dans l'ordre suivant ->('zip' || 'png'), qui, parce qu'au moins un n'est pas nul, renvoie TRUE. Substituer cela en maintenant, ($ext == TRUE), que je vais sortir sur un membre et deviner que php évalue juste ceci le même que ce serait ($ext), ce qui est également vrai.

if ($ext == 'zip' || $ext == 'png') va vérifier ce que vous cherchez.

2

C'est certainement possible, mais ce que vous faites ici est un code incorrect. Voici ce que vous avez écrit:

if($ext == ('zip' || 'png')) { echo "Is it possible ?" } 

Et voici ce qui se traduit en php:

if((if $ext evaluates to true then return true) == (if 'zip' evaluates to true then return true || if 'png' evaluates to true then return true)) 

Alors, puisque « zip » est pas une des valeurs « vides » ou « faux » défini en php, et ni est « .png », vous êtes essentiellement d'exécuter cette instruction if:

if($ext == true) 

qui, si elle est pas vide, il le fait.

Qu'est-ce que vous voulez est - comme mentionné précédemment:

if($ext == 'zip' || $ext == 'png') 
2

conseils Minuscule: PHP utilise similaire à C manipulation de type booléen dans un sens qui en fait une valeur non nulle est considéré comme « vrai » dans cas de résidence dans la partie conditionnelle de if- déclaration. par exemple si vous perdez le symbole '=' dans la construction de comparaison et tapez if($var = "val") au lieu de if($var == "val") vous obtiendrez toujours une vraie valeur dans cette instruction, car l'opérateur '=' retournera comme résultat de la valeur de l'opération d'ensemble dans la partie droite " val "qui est tour à tour converti en" vrai ".il est donc préférable d'écrire le littéral dans la partie gauche de la condition de comparaison if("val" == $var) parce que dans ce cas, vous obtiendrez une erreur si vous perdez un symbole '=' dans '==' compare.

de sorte que votre instruction if doit ressembler à ceci: if('zip' == $ext || 'png' == $ext) { echo "Is it possible ?" }

aussi il serait probablement préférable de mettre « zip » et « .png » littéraux dans des constantes avec des noms FILE_TYPE_ZIP, FILE_TYPE_PNG ou définir une entité énumérés comme global PHP-array qui réside en haut de votre page-source ou probablement même créer une classe distincte SupportedFileTypes dans un fichier externe qui mettrait l'accent sur les types de fichiers pris en charge de votre programme (dans ce cas, consultez PHP and Enumerations pour plus de détails). Au début du développement de la question de la performance n'a pas à vous déranger car il est crucial d'écrire un code qui est facile à lire et à évoluer/optimiser à l'avenir.