2012-07-16 16 views
6

PHP zawsze zwraca wartość false, gdy używam in_array(), a to, czy jest lub nie jest w tablicy, nie ma znaczenia. Na przykład:PHP in_array() zawsze zwraca false

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

Powroty 'not found' chociaż 'test' jest wartością w tablicy

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

Powroty 'Not Found', jak to powinno

Dlaczego powrocie fałsz, kiedy to powinno być prawdą? Proszę podać wszelkie sugestie. Lista, której aktualnie używam ma ponad 10 tysięcy wartości, dlatego właśnie ją skróciłam.

+0

Z jakiego systemu operacyjnego korzystasz? W oknach końcami linii są właściwie dwa znaki: \ r \ n, więc podzielenie go na \ n da ci "tekst \ r", "listę \ r" i "przykład". –

+0

czy jesteś pewien, że masz '\ n', a nie' \ r \ n'? –

+0

Czy możesz 'var_dump ($ list_arr);' i wysłać dane wyjściowe? – MrGlass

Odpowiedz

9

Jeśli używasz dokładnie ten przykład i kodowania na komputerze z systemem Windows, problem wynika z faktu, że linia Windows przechowuje żeruje przy użyciu:

\r\n 

Zatem, kiedy podzielone na \ n tylko ty trzymasz niewidzialne \ r na końcu przedmiotów i nie pasują do tego powodu.

+0

Jestem na Linuksie, jednak to naprawiło problem –

+0

Można go skonfigurować w edytorze, który nie powinien być notepad – Esailija

+0

Używam Notepad ++ do kodowania mojego php –

8

Twoja lista jest właściwie oddzielona \r\n, a nie tylko \n.

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

Pokonaj mnie przez to ... 4 sekundy? –

+0

Dobrze, a kiedy oddzielisz słowo "\ r", otrzymasz "text \ r" jako ciąg znaków - spróbuj więc umieścić go w 'in_array()', aby zobaczyć. – Ariel

+0

@MathieuDumoulin: Jestem ninja: P –

0

Jak już wspomniano, Windows używa \ r \ n jako znaku końca linii. Unix używa \ n, a Mac używa \ r. Aby uczynić przenośny kod, użyj PHP_EOL stałą eksplodować swój ciąg:

$list_arr = explode(PHP_EOL, $list) 

Dzięki temu masz pewność, że zawsze działa poprawnie.

+0

Nie prawda, ponieważ Windows będzie przechowywać EOL jako \ r \ n, ale jeśli uruchomisz go na komputerze z Linuksem, będzie to \ n tylko: http: //ca3.php. net/manual/en/reserved.constants.php –

+0

@MathieuDumoulin podany link nie oznacza tego. Po prostu mówi "prawy koniec linii" na platformie. Moje rozwiązanie nie zadziałałoby, gdybyś używał edytora zakończonego Windows na platformie Unix. –

1

To dość dziwny sposób na umieszczenie wartości na liście. Zakładam więc, że ostatecznie próbujesz linii z oddzielnego pliku do tablicy. W takim przypadku wystarczy wykonać jedną linijkę w oddzielnym elemencie tablicy, aby uzyskać

file('path/to/file'); 

.

Jeżeli plik odwołuje wygląda następująco:

test 
list 
example 

Jeśli znasz wartości z przodu jak w przykładzie kodu, należy po prostu umieścić je do tablicy zamiast czytać je z ciągiem.

Jeśli po prostu musisz odczytać wartości z ciągu, sugerowałbym użycie stałej PHP_EOL do zdefiniowania twoich podziałów linii. W ten sposób:

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

Stała PHP_EOL da ci znacznie lepszy sposób niezależnego od platformy uzyskania wartości definiujących twoje łamania linii.

Powiązane problemy