aide a la fonction explode

Eléphanteau du PHP | 17 Messages

09 août 2007, 15:53

bonjour a tous ,
voila mon problé:
-j'ai un textarea qui renvoie une descriprion dans une feuille contenant un script
-a l'intérieure de cette derniere je créer une variable pour chaque mots grace a la fonction explode

mon souci:
-j'extrait les mot de cette maniere $tab=explode(" ",$text) //il recherche chaque espace
-dans le textarea si je tape 1 2 3 4 cela marche sans souci le tableau est correctement rempli :
$tab[0] = 1
$tab[1] = 2
$tab[2] = 3
$tab[3] = 4
-par contre si je tape 1 2
3 4
le tableau se rempli mal:
$tab[0] = 1
$tab[1] = 2 3
$tab[2] = 4

question:
comment donner plusieurs ordre de coupure a explode?
en effet il recherche que les espace et non les retour de ligne.

d0m
Mammouth du PHP | 1141 Messages

09 août 2007, 15:57

il suffit d'enlever les sauts de lignes de la chaine avant de faire l'explosion ou des les remplacer par des espaces.
str_replace t'aidera

ViPHP
ViPHP | 928 Messages

09 août 2007, 16:02

Plus propre : utiliser preg_split()
$str = preg_split('/\s/is', $str);
print_r($str);

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

09 août 2007, 16:09

Complément de la réponse de Genova
Attention, l'utilisation de preg_split() est uniquement conseillée lorsqu'il est intéressant d'utiliser les expressions régulières, comme dans ce cas ...

D'ailleurs, il y a un avertissement dans la doc de preg_split() :
Si vous n'avez pas besoin de la puissance des expressions régulières, vous pouvez choisir des alternatives plus rapides (quoique plus simples) comme explode() ou str_split().
Connaître son ignorance est la meilleure part de la connaissance
Pour un code lisible : n'hésitez pas à sauter des lignes et indenter

twitter - site perso - Github - Zend Certified Engineer

Eléphanteau du PHP | 17 Messages

09 août 2007, 16:51

Merci a tous pour cette elan et cette reactivité,
jarrive a selectionner chaque mots pour constituer ma requete mais cela me genere un petit bug

Code : Tout sélectionner

//extraction des mots $mots = preg_split('/\s/is', $rech); .... //construction de la condition de la requete for ($i=0; $i<$long;$i++) { $condition_proc = $condition_proc .'AND proc_s_description like \'%'.$mots[$i].'%\' '; $condition_proc = ltrim($condition_proc,'AND'); $tab_proc="proc_soft"; - ..... .... //creation de la requete $sql_proc_logi='Select * from '.$tab_proc.' where '.$condition_proc ; ...
quoi qu'il arrive la requette se construit bien mais n'est pas forcement utilisable:
-requette (exemple avec retour a la ligne):
Select * from proc_soft where proc_s_description like '%test%' AND proc_s_description like '%test%' AND proc_s_description like '%%' AND proc_s_description like '%op%'

probléme
-cette recherche en ligne (ecri en ligne dans le textarea) me retoune un resultat
-par contre ecrite dans le textarea avec un retour a la ligne (me donne cette requete que vous voyez avec une condition inutile représenté en gras) et ne me retourne pas de resultat

ViPHP
ViPHP | 928 Messages

09 août 2007, 16:56

Essaie comme ceci :
// Séparation des mots clefs dans un tableau
$words = preg_split('#[^\S]+#si', $rech);

foreach ($words AS $key => $word)
{
   // Ici tu filtre, par exemple inutile de garder les mots de deux lettres ou moins
   if ($word && strlen($word) > 2)
   {
      $query .= (($query) ? ' AND ' : '') . ' proc_s_description LIKE \'%' . mysql_real_escape_string($word) . '%\' ';
   }
}

echo $query;
PS : il est important que tu saches que la recherche avec LIKE est extrèmement lente, dès que tu commenceras à avoir plus de 1000 entrées ça risque de fortement ralentir. Il existe une méthode bien plus efficace : le FULLTEXT

Eléphanteau du PHP | 17 Messages

13 août 2007, 11:59

bonjour a tous, ce matin j'ai un gros souci avec la fonction elle semblai marchai la semaine derniere mais ce matin petite surprise quan je commencais a attaquer les conditions recurantes...
mon souci par l'exemple:

test tapé dans la zone de recherche :
test test
test

 //ici je test le retour a la ligne

//parti code
//je recupere les mot un a une de la recherche
$mots = preg_split('#[^\S]+#si', $rech);
// je test a l'affichage
echo '0 <br>'; [b]//cela m'affiche bien test[/b]
echo $mots[0];
echo '<br>1<br>';//cela m'affiche bien test
echo $mots[1];
echo '<br>2<br>';[b]//cela m'affiche bien la coupure du retour a la ligne[/b]
echo $mots[2];
echo '<br>3<br>';//cela m'affiche bien test
echo $mots[3];
echo '<br>4<br>';
echo '<br>';

// je recupere le nombre de mots il m'en compte 4
$long = count($mots);
echo 'count = '.$long;[b] // il maffiche bien une longueur de 4[/b]

//initialisation de la variable condition
$condition = "";
$i=0;

//condition de test
if($type="3" and $rtype="2")
     {
       //recherche par mot clé (tous) - logiciel
       for ($i=0; $i<$long;$i++)
       {
       if($mots[$i]=! "")[b]//test forcer pour kil prenne tous les mot pour afficher la requete[/b]
               {
               echo $table[$i].'<br>'; // je souhaiter tester l'affichage des mots un par un mais cela m'affiche une lettre par ligne dans notre test 3, et c'est lettre corresponde pas forcement au text rechercher: r e l
               $condition =  $condition .'AND proc_soft.proc_s_description like \'%'.$mots[$i].'%\' OR pb_soft.pb_s_description like \'%'.$mots[$i].'%\'';
               $condition = ltrim($condition,'AND');
               $table = '(relation_soft_pb LEFT JOIN proc_soft ON proc_soft.proc_s_num = relation_soft_pb.proc_s_num)LEFT JOIN pb_soft ON relation_soft_pb.pb_s_num = pb_soft.pb_s_soft';
               }
       }

    }
la requete en sorti me donne :

Code : Tout sélectionner

Select * from (relation_soft_pb LEFT JOIN proc_soft ON proc_soft.proc_s_num = relation_soft_pb.proc_s_num)LEFT JOIN pb_soft ON relation_soft_pb.pb_s_num = pb_soft.pb_s_soft where proc_soft.proc_s_description like '%1%' OR pb_soft.pb_s_description like '%1%'AND proc_soft.proc_s_description like '%1%' OR pb_soft.pb_s_description like '%1%'AND proc_soft.proc_s_description like '%1%' OR pb_soft.pb_s_description like '%1%'AND proc_soft.proc_s_description like '%1%' OR pb_soft.pb_s_description like '%1%'
vous pouvez constater que la valeur 1 est testé pour chaque condition au lieux de test
si je corrige la condition affin quelle ne prenne que les valeur supérieur a 2 caractére et bien la requête plante.

J'ai besoin de votre aide merci ...
Modifié en dernier par cyberneo le 13 août 2007, 12:01, modifié 1 fois.

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

13 août 2007, 12:00

Modération :
cyberneo, afin d'améliorer la lisibilité de ton message,
pense à utiliser les balises [code] ou [php] (selon le langage utilisé).

Elles sont disponibles au-dessus de la zone de saisie de ton message
lorsque tu postes un nouveau message.

Des indications sont disponibles sur la manière de mettre en forme vos messages dans la FAQ



Edit : l'opérateur " =! " n'existe pas ... :
if($mots[$i]=! "")
Edit bis : précision... l'opérateur n'existe pas, mais tu ne dois pas avoir d'erreur cas php doit probablement t'associer la valeur inverse de "chaine vide" (donc considéré comme false, l'inverse étant true) dans ta variable $mots[$i] ...
Modifié en dernier par Ryle le 13 août 2007, 12:04, modifié 1 fois.
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

Eléphanteau du PHP | 17 Messages

13 août 2007, 12:03

Modération :
cyberneo, afin d'améliorer la lisibilité de ton message,
pense à utiliser les balises [code] ou [php] (selon le langage utilisé).

Elles sont disponibles au-dessus de la zone de saisie de ton message
lorsque tu postes un nouveau message.

Des indications sont disponibles sur la manière de mettre en forme vos messages dans la FAQ
C'est justement pour la lisibilité de met com étan,t un post avec beaucoup de com j'ai mit les principaux en gras pour permettre au sauveur de comprendre commen j'ai testais mes étapes.
les balise code ne me permettai pas de mettre en gras certaine ligne il mais tous le contenu de mon text en vert :p je sais pas fair sinon...

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

13 août 2007, 13:07

Bah peut être, mais c'est beaucoup plus facile de lire et comprendre un code en couleur... les commentaires étant en orange on ne les loupes pas, même si on ne peut pas les mettre en gras. Et pour sousligner les plus important, ben suffit de dégager ceux qui ne le sont pas (voire le code inutile) et on ne pourra manquer de les voir ;)

En attendant, as-tu regardé du côté de ton " =! " pour voir si ton problème ne venait pas de là ? :)
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

Eléphanteau du PHP | 17 Messages

13 août 2007, 13:26

oui escuse moi je lme suis rapproché de ce coté et apparemen c'est le souci ^^