Comment chercher dans un tableau en PHP

Zecat

WRInaute accro
je rame sur un truc tout simple :

j'ai un tableau $tab :

Code:
$tab[0]="001|xxxxxxxxxxxxx";
$tab[1]="123|aaaaaaaaaaaaaaaaa";
$tab[2]="018|cccccccccc";
$tab[3]="017|dddddd";
.
. 
$tab[nnn]="002|aaaaaa";
$tab[nnn]="044|mmmmmmmmmmm";
nnn pouvant etre compris entre 10 et un millier

et je veux trouver par un cherche dans tableau le rang de la ligne qui contient :

"017|"

Je trouve pas la bonne méthode (autrement qu'en bouclant et en testant ! :-/)

array_search() semble de chercher que des valeurs exactes ... a moins qu'on puis mettre un joker et dire recherche la valeur "017|*"

* etant le joker ?

PS : si je suis finalement obligé de faire un foreach ... : peut on arreter un foreach avant la fin ?

Code:
foreach()
{
    if (j'aitrouvé)
    {
        SORTIR DU FOREACH ??????
    }
 
}
 

Blount

WRInaute impliqué
Re: Je merdouille sur un search in tableau ...

N'hésite pas à utiliser la balise CODE.

Sinon, oui, tu peux stopper la boucle (while, for, etc.) avant la fin :
Code:
foreach ($tabs AS $value) {
    if (yes) {
        break;
    }
}

Sinon, là comme ça, je ne vois pas de fonction déjà existante.
 

Zecat

WRInaute accro
Re: Je merdouille sur un search in tableau ...

sorry pour la balise j'avais oublié ... c'ets corrigé

bon finalement comme ce tableau vient d'un file, je vais faire un file get contents au lieu du file et puis un strpos suivi d'un substr ...
 

Blount

WRInaute impliqué
Re: Je merdouille sur un search in tableau ...

Si ça vient d'un fichier, utilises plutôt fopen.

La différence est que file_get_contents récupère le contenu de tout le fichier, alors qu'avec fopen, tu vas simplement récupérer les données une ligne par une ligne et déplacer un curseur.
Tu éviteras une consommation inutile de mémoire.
 

Zecat

WRInaute accro
Re: Je merdouille sur un search in tableau ...

Dans le cas d'espece je prefere faire un unqiue get content suivi d'un strpos et hop c'est trouvé plutot que 500 accès ligne par ligne si le tableau fait 500 lignes ...

Je me trompe peut etre mais je sens confusement que 1 get content et 1 strpos ca consomme moins que 500 acces ligne a ligne. Ensuite de toute façon une fois ma chaine trouvée ma variable $texte ayant recu le get content est raz ...
 

forummp3

WRInaute passionné
Re: Je merdouille sur un search in tableau ...

salut,

je te conseil d'inserer ton tableau dans une bdd.

Si ton format est toujours tu du 000|letltres et qu'il n'y a jamais de | (barre) dans tes lettres, alors tu peux utiliser la fonction explode a chaque ligne.

sinon:




foreach($tab as $value)
{
$ligne=explode("|",$value);

if($ligne[0]=="017")
{
echo "ligne trouvé"; break;
}

}
 

Zecat

WRInaute accro
Re: Je merdouille sur un search in tableau ...

Je suis un grand consommateur de foreach et explode en cascade ... mais la je persiste a considérer que plutot qu'un

file
foreach
explode
test

avec une boucle qui tourne 500 ou 1000 fois

un get content
et un strpos

ca consommera moins ... et ca sera plus veloce. Si le php etait un langage compilé je dis pas mais en interprété, je pense que y a pas photo.
 

forummp3

WRInaute passionné
Re: Je merdouille sur un search in tableau ...

mais quel est ton cas specifique ? car comme je te l'ai dis, si tu dois faire ce test plusieurs fois, mieux vaux mettre ces infos dans la bdd, c'est fait pour, il y a des index. Aprés si ton fichier change toutes les secondes, faut faire le test en direct, ou bien alors de demander a la personne qui t'envoie ce tableau de le mettre en bdd et de te faire une page de test, par exemple tu appel la page verif_exist.php?chaine=017

Donc, ton tableau, il sort d'ou? est ce qu'il change? a quel rythme ? est ce que c'est une page distante? une page locale ?
 

Leonick

WRInaute accro
essaie avec array_filter et comme fonction de filtrage en utilisant un preg_match du genre "^nnn"
plutôt que file_get_contents je préfère utiliser file qui te renvoie le fichier sous forme de tableau. Comme ça ton fichier est plus concis : 1 ligne dans le fichier c'est une ligne dans le tableau
 

Zecat

WRInaute accro
Leonick a dit:
essaie avec array_filter et comme fonction de filtrage en utilisant un preg_match du genre "^nnn"
plutôt que file_get_contents je préfère utiliser file qui te renvoie le fichier sous forme de tableau. Comme ça ton fichier est plus concis : 1 ligne dans le fichier c'est une ligne dans le tableau
Heu non ... j'ai besoins de la suite ... mon fichier sur disque :

001|aaaaaaaa|
018|xxxxxxxxxxxxxxxx|
004|zzzzzzzzzzzzz|
etc (10 à 1000 lignes)

Donc pour le moment je passe pas par file mais par in file get content puis je fais :
strpos avec "018|" comme valeur (1018 n existe pas donc pas de risque)
puis un substr de $pos+4 à la fin
strrpos avec "|" comme valeur
me reste plus qu'a faire un substr de la bonne longueur (de 0 sur longueur $pos) pour recupérer xxxxxxxxxxxx

Donc je fait pas une boucle sur 1000 si mon occurence est a la fin ... je serais passé par un tableau si la fonction de recherche dans tableau permettait de dire :

cherche "018|*" * etant un joker
 

Zecat

WRInaute accro
Re: Je merdouille sur un search in tableau ...

forummp3 a dit:
mais quel est ton cas specifique ? car comme je te l'ai dis, si tu dois faire ce test plusieurs fois, mieux vaux mettre ces infos dans la bdd, c'est fait pour, il y a des index. Aprés si ton fichier change toutes les secondes, faut faire le test en direct, ou bien alors de demander a la personne qui t'envoie ce tableau de le mettre en bdd et de te faire une page de test, par exemple tu appel la page verif_exist.php?chaine=017

Donc, ton tableau, il sort d'ou? est ce qu'il change? a quel rythme ? est ce que c'est une page distante? une page locale ?
C'est pas la question ... j'ai ce fichier en entrée et je ne veux pas modifier cet aspect ...
 

Leonick

WRInaute accro
Zecat a dit:
je serais passé par un tableau si la fonction de recherche dans tableau permettait de dire :
cherche "018|*" * etant un joker
justement, tu peux, avec des regex dans ta fonction de filtrage de tableau
Code:
$filtrage=array_filter($tableau_donnees,$ok4key);
function $ok4key($var){
global $cle_a_trouver;
return (preg_match("#^$cle_a_trouver#i",$var)>0);}
si $cle_a_trouver n'est pas modifiée durant l'appel, autant utiliser une constante
et quand tu as obtenu ton tableau filtré, tu fais un explode et tu as ton contenu
 

Discussions similaires

Haut