Array_Splice, besoin d'éclaircissement

Eléphant du PHP | 447 Messages

26 avr. 2010, 11:39

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! : )
Probably (only a) Human Problem?

Eléphant du PHP | 447 Messages

26 avr. 2010, 11:46

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....
Probably (only a) Human Problem?

Mammouth du PHP | 672 Messages

26 avr. 2010, 12:05

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()...

Eléphant du PHP | 447 Messages

26 avr. 2010, 12:18

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;
								
	}
							
}
Probably (only a) Human Problem?

Mammouth du PHP | 672 Messages

26 avr. 2010, 12:40

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>

Eléphant du PHP | 447 Messages

26 avr. 2010, 13:24

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! : )
Probably (only a) Human Problem?

ViPHP
ViPHP | 5462 Messages

26 avr. 2010, 13:25

par contre si y'a pas d'espace ca va pas le faire par exemple :

Code : Tout sélectionner

le test,à toto

Eléphant du PHP | 447 Messages

26 avr. 2010, 13:34

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...
Probably (only a) Human Problem?