Recherche ligne dans fichier txt

L'auteur de ce sujet a trouvé une solution à son problème.
Auteur du sujet

Bonjour à tous !

je suis en train de m'arracher les cheveux sur un petit truc de rien du tout, si quelqu'un comprend, qu'il vienne me sauver :D :

j'ai un fichier texte (.txt) dans lequel j'ai enregistrer plusieurs valeurs (1 par ligne), ce qui donne ceci :

1
2
3
32
725
1654

coté php, j'ouvre ce fichier avec la fonction file pour récupérer un tableau dont chaque case contient une ligne de mon fichier :

1
2
3
<?php
$file = "myfile.txt";
$tab= file($file);

ce qui donne ceci :

1
2
3
[0] => 32
[1] => 725
[2] => 1654

jusque-là, tout va bien !maintenant, je fait un in_array pour chercher un nombre dans mon tableau :

1
2
3
4
5
6
7
<?php
if(in_array('725',$tab)) {
   echo"glop ";
}
else {
   echo"pas glop";
}

mon soucie ? mon code ne retrouve pas mes recherches…ce qui est étrange, c'est que si je déclare le contenu du fichier txt directement dans un tableau :

1
2
<?php
$test = array('32', '725', '1654');

pas de soucie, ma recherche porte ses fruits…mais pourquoi ça marche pas avec mon array dans un fichier txt ?

je vous met le code complet au cas ou un truc con vraiment très très bête m'échapperais…

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
<?php
$file = "ctrl/black_list_ip.txt";
$tab = file($file);
//$tab = array('32','725','1654');
if(in_array('725',$tab)) {
   echo "glop";
}
   else {
echo "pas glop";
}

Vous m’avez reproché de penser que j’avais toujours raison. Et je me suis rendu compte que vous aviez raison.... Mais allez savoir si j’ai raison !

+0 -0

A mon avis ce n'est pas comme ça qu'il faut procéder, ouvre ton fichier normalement.

Ensuite soit tu parcours chaque ligne avec une boucle for et tu compares ce que tu lis (grâce à fgets) avec le nombre que tu cherches (725).

Soit tu utilises une Regex : preg_match("725", $file).

Édité par Croal

hello, world !

+2 -1

Es-tu sûr que ton tableau déclaré à la main et ton tableau venant du fichier sont pareils? Il n'y a pas un espace ou autre qui traîne?

Une boucle for fonctionnerait, mais serait totalement contre productive en cas de gros fichier. Utilise une boucle while, de façon à ce que tu arrêtes ton parcours du tableau dans le cas où la valeur a été trouvée (Je m'arrête à la 105ème ligne au lieu de parcourir mes 2 mille lignes du fichier).

Edit: +1 avec Croal pour le regex.

Édité par jeremyb

+0 -0

Hello babas,

Inutile de t'arracher les cheveux, en fait tes nombres sont reconnus par PHP comme des entiers et non comme des chaines de caractères… :

1
2
3
4
5
6
<?php
if (in_array(725, $tab)) {
   echo "glop";
} else {
   echo "pas glop";
}

Édité par EtienneR

HTTP/1.1 418 I'm a teapot

+1 -0
Auteur du sujet

bien vu EtienneR ! je suis quiche des fois…faut dire, ça fait un bon moment que j'ai pas codé…j'ai un peu rouillé :D !

merci à tous, je passe en résolu !

Vous m’avez reproché de penser que j’avais toujours raison. Et je me suis rendu compte que vous aviez raison.... Mais allez savoir si j’ai raison !

+0 -0

Parce que les comparaisons ne sont pas strictes par défaut (cf 3^e paramètre de in_array) ainsi en cherchant un entier à la place d'une chaîne, lors de la comparaison les éléments du tableau sont d'abord castés (de string en int).

Ca ne marchait pas avec une chaîne parce que file, par défaut (voir flag FILE_IGNORE_NEW_LINES qu'il est possible de passer en 2^e paramètre de file), garde le(s) caractère(s) de saut de ligne (CR et/ou LF). "725" est bien différent de "725\n" ou autre variante.

Et la cast string => int s'arrêtant sur le premier caractère non chiffre, les CR/LF ne sont pas/plus problématiques.

Édité par vibrice

+0 -0
Vous devez être connecté pour pouvoir poster un message.
Connexion

Pas encore inscrit ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte