2012-07-16 27 views
6

PHP siempre devuelve falso cuando uso in_array(), y no importa si está o no en la matriz. Por ejemplo:PHP in_array() siempre devuelve falso

$list = 'test 
list 
example'; 
$list_arr = array(); 
$list_arr = explode("\n",$list); 
if (in_array('test',$list_arr)) { 
    echo 'Found'; 
} 
else { 
    echo 'Not Found'; 
} 

devoluciones 'not found' a pesar de 'prueba' es un valor de la matriz

$list = 'test 
list 
example'; 
$list_arr = array(); 
$list_arr = explode("\n",$list); 
if (in_array('qwerty',$list_arr)) { 
    echo 'Found'; 
} 
else { 
    echo 'Not Found'; 
} 

devoluciones 'not found', como debe

¿Por qué se vuelve falso cuando debería ser cierto? Por favor, da cualquier sugerencia. La lista que estoy usando tiene más de 10K de valores y, por lo tanto, la acorté aquí.

+0

¿Qué sistema operativo está utilizando? En Windows, un final de línea es en realidad dos caracteres: \ r \ n, por lo que dividirlo en \ n le dará 'text \ r', 'list \ r' y 'example'. –

+0

¿estás seguro de que tienes '\ n' y no' \ r \ n'? –

+0

¿Puedes 'var_dump ($ list_arr);' y publicar el resultado? – MrGlass

Respuesta

9

Si está utilizando este ejemplo exacta y está codificando en un PC con Windows, el problema viene del hecho de que Windows almacena avances de línea usando:

\r\n 

Por lo tanto, cuando se divide en \ n solo mantiene un \ r \ n invisible al final de sus artículos y no coinciden por ese motivo.

+0

Estoy en Linux, sin embargo, eso solucionó el problema –

+0

Se puede configurar en el editor, que no debería ser el bloc de notas – Esailija

+0

Utilizo Notepad ++ para codificar mi php –

8

Su lista está actualmente separada por \r\n, no solo \n.

$list_arr = explode("\r\n",$list); 
+0

Pásame por eso ... ¿4 segundos? –

+0

Correcto, y cuando se separa por "\ r" termina con "texto \ r" como la cadena, así que intente poner eso en 'in_array()' solo para ver. – Ariel

+0

@MathieuDumoulin: Soy un ninja: P –

0

Como ya se indicó, Windows usa \ r \ n como caracteres de final de línea. Unix usa \ n y Mac usa \ r. Para hacer que el código portátil, utilice la constante PHP_EOL a explotar su cadena:

$list_arr = explode(PHP_EOL, $list) 

esta manera, usted está seguro de que siempre funciona correctamente.

+0

No es cierto, ya que Windows almacenará EOL como \ r \ n pero si lo ejecuta en una PC Linux, será \ n solamente: http: //ca3.php. net/manual/es/reserved.constants.php –

+0

@MathieuDumoulin el enlace proporcionado no indica eso. Simplemente dice "el personaje de final de línea correcto" para la plataforma. Mi solución no funcionaría si usaras un editor terminado en Windows en una plataforma Unix. –

1

Esa es una manera bastante extraña de obtener valores en una lista. Así que estoy asumiendo que finalmente está tratando de líneas de un archivo separado en una matriz. En ese caso, simplemente lo haría

file('path/to/file'); 

Para leer cada línea en un elemento de la matriz por separado.

Cuando el archivo de referencia se parece a:

test 
list 
example 

Si conoce los valores en la delantera como en su ejemplo de código, sólo debe ponerlos en una matriz en lugar de leerlos de una cadena.

Si simplemente debe leer los valores de una cadena, le sugiero que use la constante PHP_EOL para definir sus saltos de línea. De esta manera:

$list = 'test' . PHP_EOL . 'list' . PHP_EOL . 'example'; 
$list_arr = explode(PHP_EOL, $list); 

La constante PHP_EOL va a darle una forma mucho mejor plataforma independiente de conseguir valores que definen sus saltos de línea.

Cuestiones relacionadas