Ajouter des "0" devant une ID en fonction de l'ID

Eléphant du PHP | 428 Messages

12 mars 2010, 19:49

Salut,

Désolé de ne pas être plus clair dans le titre mais je ne voyais pas quoi dire d'autre.
Aujourd'hui, je recherche à ajouter des "0" dans des id (renvoyées par POST ==> 1 ID par POST).

Le nombre de 0 que je dois afficher devant l'ID dépend de l'id récupérée...

En effet, si j'ai une ID de 1 à 9, je dois afficher 5 zeros devant l'id ==> Exemple : 000001, 000002, ... 000009
Maintenant si j'ai une ID de 10 à 99, je dois afficher 4 zeros devant l'ID ==> Exemple : 000010, ... 000099
Et ainsi de suite ... si j'ai une ID de 1000 à 9999, je dois afficher 2 zeros, Etc ... (jusque 100000 à 999999 -> il n'y a plus de 0)

Comment puis-je tester le nombre de chiffres que me retourne une ID pour savoir le nombre de zeros que je dois ajouter devant ?

Peut être n'est-ce pas la bonne solution et qu'un regex ou autre viendrait à bout de cela ... ???

Merci pour vos réponses,
raph

Mammouth du PHP | 985 Messages

12 mars 2010, 20:30

Avec ou strlen() ou mb_strlen() :
http://php.net/manual/fr/function.strlen.php
http://www.php.net/manual/fr/function.mb-strlen.php

Et éventuellement utiliser explode() avant si ton ID ne contient pas que des chiffres...
Face à la roche, le ruisseau l'emporte toujours, non pas par la force mais par la persévérance.

ViPHP
ViPHP | 1024 Messages

12 mars 2010, 22:04

ça peut se faire directement avec cette fonction : http://fr.php.net/manual/fr/function.sprintf.php

A+

Pascal

Eléphant du PHP | 428 Messages

12 mars 2010, 22:27

Merci pour vos réponses.

J'ai fait ça avec strlen mais c'est assez lourd et pas très dynamique (si l'id est suppérieure à 999999, il faut que je remodifie ma fonction) ...
Je me disait, vu le message de pascaltje, que j'allais utiliser la fonction sprintf mais je dois avouer que l'établissement d'un masque est assez difficile pour moi.
$galid = $row['gallery_id'];
	 	 
 
	function classement ($id) {
	 $countid = strlen($id);
		 
		if ($countid == 1) {
		 return '00000';
		} elseif ($countid == 2) {
		 return '0000';
		} elseif ($countid == 3) { 
		 return '000';
		} elseif ($countid == 4) {
		 return '00';
		} elseif ($countid == 5) {
		 return '0';
		} elseif ($countid == 6) {
		 return '';
		}
	}
	
	 $zero = classement($galid);

        //Si l'id = 1, $Int_Title doit normalement afficher : 000001
	 $Int_Title = $zero.$galid;
Pouvez-vous m'aider à améliorer cette fonction voire me donner une sérieuse piste de fonctionnement avec sprintf ?

Merci,
raph

Mammouth du PHP | 985 Messages

12 mars 2010, 23:00

Je laisse à pascaltje le soin de répondre pour sprintf.

Sinon, ceci devrait fonctionner:
echo substr_replace('000000', $id, '-' . strlen($id));
à quelque chose près, pas testé... :wink:

http://www.php.net/manual/fr/function.s ... eplace.php
Face à la roche, le ruisseau l'emporte toujours, non pas par la force mais par la persévérance.

ViPHP
ViPHP | 1024 Messages

12 mars 2010, 23:10

L'exemple 6 de la page :
printf("[%06s]",   $s);
Qui doit faire :
- remplir par la gauche...
- avec des 0 ...
- pour faire une chaine de 6 caractères maximum

A+

Pascal

ViPHP
ViPHP | 1136 Messages

12 mars 2010, 23:10

Salut ,

il existe simplement la fonction str_pad

exemple :
$input = "10";
$newid = str_pad($input, 6, "0", STR_PAD_LEFT);//newid => 000010;
Voici la doc : str_pad

Bonne continuation ,
Ch.

Eléphant du PHP | 428 Messages

13 mars 2010, 00:12

Merci pour vos réponses à tous !
J'ai finalement opté pour la solution de dr@ke utilisant le "substr_replace".
function classement ($id) {
 return substr_replace('000000', $id, '-' . strlen($id));
}

$galid = $row['gallery_id'];
$title = $row['gallery_title'];
$Int_Title = classement($galid).'-'.$title; // return -> 000001-[titleofthepage] for id 1

Encore merci pour tout,
raph ;)

Mammouth du PHP | 985 Messages

13 mars 2010, 00:39

Pour être sincère ma solution est la moins appropriée dans ton cas:
Si c'est juste pour directement afficher $id, alors le printf est fait pour cela.
Si c'est pour traiter $id alors str_pad, est la fonction faite pour cela.
La mienne fonctionnant très bien mais c'est ce compliquer la vie pour rien :wink:
Face à la roche, le ruisseau l'emporte toujours, non pas par la force mais par la persévérance.

Eléphant du PHP | 428 Messages

13 mars 2010, 12:12

Edit : Mise à jour de la fonction en utilisant str_pad suivant les bon conseils de dr@ke.
	
function classement ($id, $title) {
return str_pad($id, 6, "0", STR_PAD_LEFT).'-'.$title;
}
		
$galid = $row['gallery_id'];
$title = $row['gallery_title'];

$Int_Title = classement($galid, $title);  // return -> 000001-[titleofthepage] for id 1

Merci !!

Raph

ViPHP
ViPHP | 2291 Messages

13 mars 2010, 14:16

Salut ,

il existe simplement la fonction str_pad

exemple :
$input = "10";
$newid = str_pad($input, 6, "0", STR_PAD_LEFT);//newid => 000010;
Voici la doc : str_pad

Bonne continuation ,
Ch.
stopher avant Dr@ke :wink:
ImageCe que l'on apprend par l'effort reste toujours ancré beaucoup plus longtemps.