count_chars : syntaxe

Eléphant du PHP | 172 Messages

08 déc. 2005, 21:06

Bonsoir !!!

J'ai de nouveau un p'tit problème :mrgreen:

Je souhaite compter le nombre d'occurences d'un caractère dans une chaîne.
J'essaie avec la fonction count_chars, mais comme j'ai pas trouvé beaucoup d'exemple, je dois certainement faire une erreur de syntaxe.

Voici le code qui ne fonctionne pas :
if(count_chars($char, '.') != 3)
{
        ...........        
}
Même en mettant trois points dans ma chaîne, la condition est toujours fausse, si quelqu'un pourrait me dire la syntaxe à utiliser pour mon exemple.

Merci :D

Mammouth du PHP | 19672 Messages

08 déc. 2005, 21:17

Le second paramètre de count-chars que tu utilises est invalide. La doc t'aurait été utile sur ce détail.

Proposition de correction:
<?php
$data = "Deux D et un F.";
foreach (count_chars($data, 1) as $i => $val)
{
    if($chr($i) == ".")
    {
        echo "Il y avait ". $val ." occurrence(s) de \"". chr($i) ."\" dans la phrase.\n";
    }
}
?>
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Eléphant du PHP | 172 Messages

08 déc. 2005, 21:32

Merci, mais j'ai déjà été voir cette fonction sur php.net.

Si je poste, c'est que je ne comprends pas trop le code qui y est présenté :oops:

Quand il y a beaucoup de paramètres, j'ai beaucoup de mal à comprendre.

Je suis obligé d'utiliser foreach pour l'appliquer ?

Ensuite, à quoi correspond le 1 ?

En même temps, j'aurais aussi une autre question, il faudrait que je vérifie que le premier et dernier caractères ne sont pas des points, avec quelle fonction(s) je pourrais vérifier ceci ?

Mammouth du PHP | 19672 Messages

08 déc. 2005, 21:42

C'est le mode, paramètre facultatif expliqué dans la documentation:
...
1 - identique à 0 mais seules les fréquences supérieures à zéro sont listées.
...
Grosso-modo, ça va compter uniquement les caractères présents à au moins un exemplaire dans la chaine et passer les autres s'ils sont absent.
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Eléphant du PHP | 353 Messages

08 déc. 2005, 21:55

En même temps, j'aurais aussi une autre question, il faudrait que je vérifie que le premier et dernier caractères ne sont pas des points, avec quelle fonction(s) je pourrais vérifier ceci ?
$chaîne[0] et $chaîne[strlen($chaîne)-1] sont respectivement le premier et le dernier caractère de la chaîne $chaîne.

Mammouth du PHP | 19672 Messages

08 déc. 2005, 22:11

À mon avis pour cette seconde partie, une expression régulière serait plus appropriée.
<?php
$masque = "#^[^\.].*[^\.]$#";
$chaine1 = "abcdefghi.";
$chaine2 = "abcdefghi";
if(preg_match($masque, $chaine1))
{
    echo("<p>La chaine numéro 1 est valide</p>");
}
else
{
    echo("<p>La chaine numéro 1 est invalide</p>");
}

if(preg_match($masque, $chaine2))
{
    echo("<p>La chaine numéro 2 est valide</p>");
}
else
{
    echo("<p>La chaine numéro 2 est invalide</p>");
}
?>
Essaye ceci, ça va te retourner:
La chaine numéro 1 est invalide

La chaine numéro 2 est valide
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Eléphant du PHP | 172 Messages

08 déc. 2005, 22:55

Merci beaucoup :D

Je l'intégrerais lorsque mon petit script fonctionnera, ce qui n'est pour l'instant pas le cas :?

Malgré le fait que ce que j'entre dans mon formulaire est valide, mon script reste bloqué à une condition.

Si vous voyez d'où cela pourrait venir.
Voici le début de mon script :
if(isset($_POST['ip']))
     {
        $ip = $_POST['ip'];
				foreach(count_chars($ip, 1) as $i => $val)		// ici on détermine combien de points sont présents dans la chaine
				{
				    if(chr($i) == ".")
				    {
				    		echo $val;		// ici : ok c'est bien 3
				    		if($val != 3)		// ici : ok
				    		{
										echo "<p id='result'>Rappel : Chaque octets d'une adresse IP est compris entre 0 et 255<br />
													Autre exemple : 86.200.25.125<br />";
								}
								else  // donc que $val == 3
								{
										$octets = explode('.', $ip);
						        if(!is_numeric($octets['0'] xor $octets['1'] xor $octets['2'] xor $octets['3']))		// le problème se situe ici
						        {
												echo "<p id='result'>Veuillez n'entrez que des chiffres de 0 à 9<br />";		//  blocage à ce niveau
												echo $octets['0']."/".$octets['1']."/".$octets['2']."/".$octets['3'];		// vérif : OK
										}
C'est la dernière condition qui bloque.

Mammouth du PHP | 19672 Messages

08 déc. 2005, 22:58

Les index étant des entiers, lève les apostrophes:
if(!is_numeric($octets[0] xor $octets[1] xor $octets[2] xor $octets[3]))
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Eléphant du PHP | 172 Messages

08 déc. 2005, 23:09

Toujours pareil :(

Je viens d'avoir l'idée de réduire les paramètres en mettant :
if(!is_numeric($octets[0]))
Et là mon programme fonctionne, et va jusqu'au bout.
je ne comprends pas :?

Est-ce que :
if(!is_numeric($octets[0] xor $octets[1] xor $octets[2] xor $octets[3]))
Est correct ?

Mammouth du PHP | 19672 Messages

08 déc. 2005, 23:12

Je suis pas certain, mais je n'ai jamais vu l'utilisation de "xor" en PHP, remplace par ||
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Eléphant du PHP | 172 Messages

08 déc. 2005, 23:47

J'ai essayé, toujours pas...

J'ai aussi essayé en remplaçant !is_numeric par !is_int, mais toujours pareil..

Je verrais demain car là, je ne vois pas trop.

Merci :wink:

Eléphant du PHP | 172 Messages

09 déc. 2005, 14:46

Bon, j'ai trouvé comment faire :
if((is_numeric($octets[0])) == false || (is_numeric($octets[1]) == false) || (is_numeric($octets[2])) == false  || (is_numeric($octets[3])) == false)
Et comme ça, ça fonctionne :D