2010-01-24 10 views
7

Actualmente estoy escribiendo una especie de gestor de descarga y me preguntaba si eso era posible:

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

Devuelve cierto cada vez, así que supongo que no es posible. ¿Pero tienes una idea de cómo podría hacer esto fácilmente? Quiero decir, no con un montón de "si" o "cambiar" ...

¡Gracias de todos modos! :)

Respuesta

22

usted podría utilizar in_array($ext,array('png','zip','another','more'))

ver aquí: http://php.net/manual/en/function.in-array.php

+0

Funciona también, pero ¿es más rápido que regex? – Minishlink

+0

no, no, probablemente dependa de la cantidad de veces que lo hagas ... de todos modos, fue lo primero que me vino a la mente :) –

+1

@Minishlink: Ambos son probablemente O (n) aunque analizan la expresión regular y construir el DFA también toma tiempo. – Gumbo

3

Puede usar expresiones regulares, p. Ej.

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

pregunta relacionada: Checking for file-extensions in PHP with Regular expressions

+0

Oh dios, me olvidé por completo de la expresión regular ... ¡Gracias! =) – Minishlink

+6

Esto parece un mal uso de la expresión regular, y una solución pobre al problema actual. –

4

Usted podría ir con una declaración 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

Sí, pero quiero hacer las mismas instrucciones para cada extensión en $ ext; así que es muy largo con esta solución ... ¡Gracias de todos modos! :) – Minishlink

+1

No entiendo. Este conmutador hará exactamente lo que usted quería con su código original. Cada vez que $ ext contenga png o zip, se emitirá "It is possible". –

+1

@Minishlink Puede ser más largo, pero es MUY fácil de mantener. No creas que el código corto == mejor código. Tiene sus pros y contras. – CodeMonkey

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

También encontré esta solución, pero cuando tengo muchas extensiones, es bastante largo para escribir. Gracias de todos modos ! :) – Minishlink

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

La matriz puede almacenarse en algún lugar, si la necesita varias veces.

10

if($ext == ('zip' || 'png')) está haciendo una comparación en el siguiente orden ->('zip' || 'png'), que debido a que al menos uno no es nulo, devuelve TRUE. Sustituir eso ahora, ($ext == TRUE), que voy a salir mal y supongo que php solo está evaluando esto igual que ($ext), que también es cierto.

if ($ext == 'zip' || $ext == 'png') comprobará lo que está buscando.

2

Definitivamente es posible, pero lo que estás haciendo allí es un código incorrecto. Esto es lo que escribió:

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

Y esto es lo que se traduce 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)) 

Por lo tanto, puesto que 'zip' no es uno de los valores de 'vacío' o 'falsos' definida en php, y tampoco lo es 'png' que está básicamente ejecutar esta sentencia if:

if($ext == true) 

lo cual, si no está vacío, lo hace.

Lo que queremos es - como se mencionó anteriormente:

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

consejos Tiny: PHP utiliza similar a C manejo de tipo booleano en un sentido que en realidad se considera cualquier valor distinto de cero para ser "true" en caso de residir en una parte condicional de una declaración if. por ejemplo, si omitiera el símbolo '=' en la construcción de comparación y escriba if($var = "val") en lugar de if($var == "val"), siempre obtendrá un valor verdadero en esa afirmación, porque '=' el operador devolvería como resultado del valor de operación establecida desde la parte derecha " val "que se convierte a su vez en 'verdadero'.así que es mejor escribir el literal en la parte izquierda de la condición de comparación if("val" == $var) porque en esta circunstancia se obtendría un error si se pierde un símbolo '=' en '==' comparar.

por lo que su sentencia if tiene que tener este aspecto: if('zip' == $ext || 'png' == $ext) { echo "Is it possible ?" }

también, probablemente, sería mejor poner 'zip' y literales 'png' en constantes con nombres FILE_TYPE_ZIP, FILE_TYPE_PNG o definir alguna entidad enumerado como una matriz PHP global que reside en la parte superior de la página de origen o probablemente incluso cree una clase separada SupportedFileTypes en un archivo externo que enfatizaría los tipos de archivos admitidos de su programa (en ese caso echa un vistazo a PHP and Enumerations para más detalles).

al comienzo del desarrollo de la cuestión del rendimiento no tiene que molestar, ya que es crucial para escribir código que es fácil de leer y evolucionar/optimizar en el futuro.

Cuestiones relacionadas