Page 1 sur 1

Array_Splice, besoin d'éclaircissement

Posté : 26 avr. 2010, 11:39
par Stef
Hellohooo : )

Je dois traiter une chaine de caractère provenant d'un formulaire afin d'en retirer certains mots, j'utilise array_splice mais le résultat n'est pas bon; voici ce que j'ai fait:
<?php
$seek = 'le test à toto';  // Chaine à nettoyer
$tabl = explode(' ', $seek);
$nbw = count($tabl);
						
$unvalidwords = array ('le', 'la', 'les', 'au', 'aux', 'et', 'ou', 'où', 'en', 'à', 'du', 'des', 'mais', 'donc', 'or', 'ni', 'ne', 'car', 'qui', 'que', 'quoi');
						
foreach ($tabl as $kv => $w2cl) {
							
	$w2cl = trim($w2cl);
							
	if (in_array($w2cl, $unvalidwords)) {
								
		array_splice($tabl, $kv);
								
	}
							
}

echo '<pre>';
print_r($tabl);
echo '</pre>';
?>
Ce qui me donne:

Array
(
)

Mon tableau ne devrait contenir que "test" et "toto" à ce point, mais là il a été entièrement vidé...

Il y a un truc qui m'échappe sur cette fonction! Vraisemblablement je l'utilise mal... Comment donc obtenir l'effet escompté?

Merci bien par avance! : )

Re: Array_Splice, besoin d'éclaircissement

Posté : 26 avr. 2010, 11:46
par Stef
Résolu en remplaçant array_splice($tabl, $kv); par ceci:

unset($tabl[array_search($w2cl, $tabl)]);


Par contre j'aimerais bien comprendre ce qui n'allait pas dans mon tuilisation de array_splice....

Re: Array_Splice, besoin d'éclaircissement

Posté : 26 avr. 2010, 12:05
par macgawel
Bonjour.

1. Pour array_splice, RTFM :
Si length est donné et positif, alors la série aura autant d'éléments. Si length est donné et négatif, les éléments seront pris dans l'ordre inverse. Si length est omis, la séquence lira tous les éléments du tableau, depuis l'offset offset jusqu'à la fin du tableau.
Il faut lui passer en paramètre une taille de 1 (élément).

2. Pour ton code de départ :
Il va y avoir un problème, une fois corrigé la fonction array_splice.
En fait, la boucle foreach opère sur une copie du tableau spécifié et non sur le tableau lui-même.
Par contre, array_splice opère sur le tableau lui-même.

1. foreach génère un tableau "copie" de $tabl qui contient (0 => 'le', 1 => 'test', 2 => 'à', 3 => 'toto')
2. Pour chacun de ces 4 éléments on va tester s'il y a besoin de faire un array_splice :
Tour 1 'le' est dans la liste, donc on fait array_splice ($tabl, 0, 1)
$tabl = ('test', 'à', 'toto')
Tour 2 : 'test' n'est pas dans la liste.
Tour 3 : 'à' est dans la liste, donc on fait array_splice ($tabl, 2, 1)
$tabl = ('test', 'à') (vu qu'on suprime $tabl[2])

Sinon, vu ce que tu veux faire tu devrais jeter un coup d'oeil sur array_diff()...

Re: Array_Splice, besoin d'éclaircissement

Posté : 26 avr. 2010, 12:18
par Stef
Merci pour ta réponse!

Effectivement les infos du manuel sont assez claires... mais tu parles à un débutant qui même s'il lit le manuel ne comprend ou n'assimile pas forcément toutes les infos; c'est pourquoi des questions peuvent se poser afin de chercher à mieux comprendre.

Cependant j'ai dû ruser pour simplifier mon code et arriver à mon but: j'ai simplement créé un nouveau tableau ne contenant que les mots autorisés...
$seek = strip_tags(mysql_real_escape_string($_POST['seeked']));
$tabl = explode(' ', $seek);
						
$unvalidwords = array ('le', 'la', 'les', 'au', 'aux', 'et', 'ou', 'où', 'en', 'à', 'du', 'des', 'mais', 'donc', 'or', 'ni', 'ne', 'car', 'qui', 'que', 'quoi');
						
foreach ($tabl as $w2cl) {
							
	$w2cl = trim($w2cl);
							
	if (!in_array($w2cl, $unvalidwords)) {
								
		$ntabl[] = $w2cl;
								
	}
							
}

Re: Array_Splice, besoin d'éclaircissement

Posté : 26 avr. 2010, 12:40
par macgawel
Effectivement les infos du manuel sont assez claires... mais tu parles à un débutant qui même s'il lit le manuel ne comprend ou n'assimile pas forcément toutes les infos; c'est pourquoi des questions peuvent se poser afin de chercher à mieux comprendre.
C'est bien pour ça que j'ai pris la peine de citer la partie intéressante du manuel :wink:

... Sinon, tu as regardé la fonction array_diff ?
array_diff() compare le tableau array1 avec le tableau array2 et retourne la différence.
$seek = 'le test à toto';  // Chaine à nettoyer
$tabl = explode(' ', $seek);
$unvalidwords = array ('le', 'la', 'les', 'au', 'aux', 'et', 'ou', 'où', 'en', 'à', 'du', 'des', 'mais', 'donc', 'or', 'ni', 'ne', 'car', 'qui', 'que', 'quoi');
$result = array_diff($tabl, $unvalidwords);
$result te retourne le tableau $tabl débarassé de tous les éléments du tableau $unvalidwords =D>

Re: Array_Splice, besoin d'éclaircissement

Posté : 26 avr. 2010, 13:24
par Stef
Donc ça serait encore plus simple avec array_diff?

Une fonction de plus dans mon arsenal...

Merci beaucoup pour les infos et tes réponses! : )

Re: Array_Splice, besoin d'éclaircissement

Posté : 26 avr. 2010, 13:25
par stealth35
par contre si y'a pas d'espace ca va pas le faire par exemple :

Code : Tout sélectionner

le test,à toto

Re: Array_Splice, besoin d'éclaircissement

Posté : 26 avr. 2010, 13:34
par Stef
par contre si y'a pas d'espace ca va pas le faire par exemple :

Code : Tout sélectionner

le test,à toto

C'est pour un moteur de recherche, donc l'utilisateur se rendra compte que y a un shmol dans sa requête...