[RESOLU] Problème avec substr_count...

Petit nouveau ! | 3 Messages

02 juil. 2021, 15:13

Bonjour à tous,

Je me tourne vers vous parce que je tourne en rond avec ce qui est sans doute une bêtise... que je ne trouve pas! =P~

Dans le code ci dessous si j'écris $pos = substr_count($ref[$i], 'LLCON') toute les entrées contenant ce texte dans l'array $ref sont détectées. Mais si j'écris $pos = substr_count($ref[$i], $value); ce n'est plus le cas. Ce sont pourtant deux string.

Code : Tout sélectionner

$j=0; for($i=0; $i<$nbre_resultats; $i++) { //echo $i.'Num: '.$num[$i].' REF: '.$ref[$i].' et xusrnet: '.$xusrnet[$i].'<BR>'; if($xusrnet[$i]==1) //Vente web ? { $tmp_ref_net[$j]=$ref[$i]; $j++; } } foreach($tmp_ref_net as $value) //On parcours les références web enregistrées { for($i=0; $i < count($ref); $i++) { $pos = substr_count($ref[$i], $value); if ($pos == 0) { echo "La chaîne '$value' ne se trouve pas dans la chaîne '$ref[$i]'".'<BR>'; } else { echo "La chaine '$value' a été trouvée dans la chaîne '$ref[$i]'".'<BR>'; } } }
Comment se fait-il que cela fonctionne si j'écris la chaine de comparaison en clair et pas sous forme de variable ?

Par contre, si je laisse l'écriture avec $value il ne détecte que l'occurence exacte... donc si $value vaut "ABCDE" il le détectera mais ne donnera rien pour "ABCDEF"

D'avance un tout grand merci,
Là je commence à m'arracher les cheveux :cry:

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

02 juil. 2021, 15:50

Salutations !

Il n'y a pas de différence entre passer une chaine de caractère en paramètre d'une fonction, ou placer cette même chaine de caractère dans une variable et utiliser ensuite cette variable lors de l'appel à la fonction. Si le comportement diffère, c'est que les valeurs diffèrent :)
$pos = substr_count($ref[$i], 'LLCON');
// et 
$value = 'LLCON';
$pos = substr_count($ref[$i], $value);
// donneront un résultat strictement identique
Es-tu sûr de la valeur de $value ? (pas d'espace avant ou après ?)
La fonction de recherche est sensible à la casse, as-tu vérifier qu'il n'y avait pas de majuscules / minuscules qui pourraient différer ?
Essayes d'afficher tes valeurs pour vérifier visuellement qu'elles correspondent à ce que tu attends (autant côté $value que $ref[$i] :))
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

Petit nouveau ! | 3 Messages

02 juil. 2021, 16:02

Bonjour... Merci pour ta réponse...

J'ai légèrement modifié le code (foreach est devenu un for et substr_count un strpos...)... le résultat est le même

Code : Tout sélectionner

for($k=0; $k < count($tmp_ref_net); $k++) //On parcours les références web enregistrées { for($i=0; $i < count($ref); $i++) { echo 'VALUE= '.$tmp_ref_net[$k].' et REF['.$i.']= '.$ref[$i].'<BR>'; if(strpos($ref[$i],'LLCONBCF') !== false && strpos($ref[$i],'LLCONBCF') <= 0 ) //On a une référence qui contient la référence du produit initial && en début de chaine { $rest = substr($ref[$i], strlen($tmp_ref_net[$k]), 3); echo 'Occurence trouvée: '; } } }
Comme tu le constateras les deux sont en majuscules. Ai testé avec stripos ceci dit, même résultat...

EDIT: Pour les espaces tu as raison, il y avait un espace à la fin de la chaine que j'utilise pour faire les comparaison.
Chose étonnante également je viens de découvrir un truc bizarre echo strlen($tmp_ref_net[$k]); qui contient donc la chaine à rechercher renvoit une longueur de 25... la chaine ne fait pourtant que 8 caractères :shock:

Si je laisse la chaine "LLCONBCF" en clair voici ce que j'obtiens à l'affichage:
https://drive.google.com/file/d/1HTgvfb ... sp=sharing

Si je change par $tmp_ref_net[$k] ça ne fonctionne plus...

Un problème de typage ? Les deux sont pourtant en string quand je les affiche avec var_dump...

Petit nouveau ! | 3 Messages

02 juil. 2021, 16:19

Je me permets un nouveau message pour une déclaration de taille... tu es un génie!!!

Code : Tout sélectionner

foreach ($tmp_ref_net as $value) //On parcourt les références web enregistrées { for($i=0; $i < count($ref); $i++) { if(strpos($ref[$i],str_replace(' ','',$value)) !== false && strpos($ref[$i],str_replace(' ','',$value)) <= 0 ) //On a une référence qui contient la référence du produit initial && en début de chaine { echo 'Occurence trouvée: '; } } }
... ne génère plus d'erreur. Il y avait des espaces!
Un tout grand merci.