|
Trouver une ressource
Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !
[PHP5.1] STRING ITERATOR
Information sur la source
Description
Depuis peu, je vois des itérateurs partout... J'ai vaguement cherché et je n'en ai pas trouvé qui touche les chaines de caractères... Alors j'en ai fait un vite fait.
Cet itérateur implémente les interfaces SeeakableIterator et Countable. Il requiert donc PHP 5.1.
Son constructeur prend en argument une chaine de caractères (une exception est levée si ce n'est pas le cas) et traite chaque caractère lors de l'itération...
******************
* MAJ 07/04/08 *
******************
Le constructeur prend désormais comme deuxième argument la direction d'itération (facultatif, par défaut de gauche à droite).
Deux fonctions s'ajoutent logiquement à la directionnalité : un getter et un setter. Changer la direction remet le pointeur au début (ou à la fin, suivant la direction, justement).
J'ai également rajouté une méthode __toString(), parce que pour ce genre d'itérateur, c'est quand même un comble de ne pas en avoir...
Et c'est sans vraiment faire exprès que j'ai trouvé une application vraiment intéressante... Le décodage d'un fichier .torrent, dont les informations sont 'bEncoded' : http://wiki.theory.org/index.php/BitTorrentSpecification#bencoding
Le package File_Bittorrent2 de PEAR implémente déjà les fonctions de traitement des fichiers .torrent, mais... sans itérateur... Et ce, malgré le fait que le package File_Bittorrent2 soit en PHP5...
Source
- <?php
-
- class StringIterator implements SeekableIterator, Countable{
-
- const LTR = 0;
- const RTL = 1;
-
- protected $iLen;
-
- protected $iKey;
-
- protected $sString;
-
- protected $dir;
-
- public function __construct($sString, $dir) {
- if (!is_string($sString)) {
- throw new InvalidArgumentException('Constructor\'s argument must be a string');
- }
- $this -> sString = $sString;
- $this -> iLen = strlen($sString);
- if ($dir != self::LTR && $dir != self::RTL) {
- $dir = self::LTR;
- }
- }
-
- public function current () {
- return $this -> sString[$this->iKey];
- }
-
- public function key () {
- return $this -> iKey;
- }
-
- public function next() {
- if ($this -> dir == self::LTR) {
- $this -> iKey++;
- }
- else {
- $this -> iKey--;
- }
- }
-
- public function rewind() {
- if ($this -> dir == self::LTR) {
- $this -> iKey = 0;
- }
- else {
- $this -> iKey = $this -> iLen - 1;
- }
- }
-
- public function valid () {
- return isset($this -> sString[$this -> iKey]);
- }
-
- public function seek($iPos) {
- if (!is_int($iPos)) {
- throw new InvalidArgumentException('Position must be an integer');
- }
- if ($this -> iLen == 0) {
- throw new UnderflowException('Empty string');
- }
- if ($iPos >= $this -> iLen || $iPos < 0) {
- throw new OutOfBoundsException('Requested position must be between 0 and string length');
- }
- $this -> iKey = $iPos;
- }
-
- public function count() {
- return $this -> iLen;
- }
-
- public function __toString() {
- echo $sString;
- }
-
- public function getDir() {
- return $this -> dir;
- }
-
- public function setDir($dir) {
- if ($dir != self::LTR && $dir != self::RTL) {
- trigger_error('dir argument can only be StringIterator::LTR or StringIterator::RTL', E_USER_NOTICE);
- }
- if ($dir !== $this -> dir) {
- $this -> dir = (bool) $dir;
- $this -> rewind();
- }
- }
- }
-
- ?>
-
- <?php
-
- /**********************
- EXEMPLE D'UTILISATION
- ***********************/
-
- require_once('./StringIterator.class.php');
-
- # On crée un tableau de correspondance aléatoire pour les besoins de l'exemple
- $aKeys = array('a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z');
- $aValues = range(1,26);
- shuffle($aValues);
- $aCode = array_combine($aKeys, $aValues);
-
- var_dump($aCode);
- # Fonction d'encodage d'une chaine par remplacement suivant un tableau de correspondances
- function MyEncodeFunction($sString) {
- # J'aime pas ça, mais là, c'est juste pratique
- global $aCode;
- # On instancie notre itérateur
- # On se contente, pour l'exemple, d'une chaine en minuscules
- $oSI = new StringIterator(strtolower($sString));
- # On initialise la variable qui contient la chaine encodée
- $sEncodedString = '';
- foreach ($oSI as $sLetter) {
- # On prend chaque lettre, et on la remplace par sa correspondante
- # On récupère le code ascii de la lettre encodée
- $sEncodedString .= chr($aCode[$sLetter]+96);
- }
- # On retourne la chaine trop bien codée ^^
- return $sEncodedString;
- }
- echo '<br />';
- print_r(MyEncodeFunction('bonjour'));
-
- ?>
<?php
class StringIterator implements SeekableIterator, Countable{
const LTR = 0;
const RTL = 1;
protected $iLen;
protected $iKey;
protected $sString;
protected $dir;
public function __construct($sString, $dir) {
if (!is_string($sString)) {
throw new InvalidArgumentException('Constructor\'s argument must be a string');
}
$this -> sString = $sString;
$this -> iLen = strlen($sString);
if ($dir != self::LTR && $dir != self::RTL) {
$dir = self::LTR;
}
}
public function current () {
return $this -> sString[$this->iKey];
}
public function key () {
return $this -> iKey;
}
public function next() {
if ($this -> dir == self::LTR) {
$this -> iKey++;
}
else {
$this -> iKey--;
}
}
public function rewind() {
if ($this -> dir == self::LTR) {
$this -> iKey = 0;
}
else {
$this -> iKey = $this -> iLen - 1;
}
}
public function valid () {
return isset($this -> sString[$this -> iKey]);
}
public function seek($iPos) {
if (!is_int($iPos)) {
throw new InvalidArgumentException('Position must be an integer');
}
if ($this -> iLen == 0) {
throw new UnderflowException('Empty string');
}
if ($iPos >= $this -> iLen || $iPos < 0) {
throw new OutOfBoundsException('Requested position must be between 0 and string length');
}
$this -> iKey = $iPos;
}
public function count() {
return $this -> iLen;
}
public function __toString() {
echo $sString;
}
public function getDir() {
return $this -> dir;
}
public function setDir($dir) {
if ($dir != self::LTR && $dir != self::RTL) {
trigger_error('dir argument can only be StringIterator::LTR or StringIterator::RTL', E_USER_NOTICE);
}
if ($dir !== $this -> dir) {
$this -> dir = (bool) $dir;
$this -> rewind();
}
}
}
?>
<?php
/**********************
EXEMPLE D'UTILISATION
***********************/
require_once('./StringIterator.class.php');
# On crée un tableau de correspondance aléatoire pour les besoins de l'exemple
$aKeys = array('a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z');
$aValues = range(1,26);
shuffle($aValues);
$aCode = array_combine($aKeys, $aValues);
var_dump($aCode);
# Fonction d'encodage d'une chaine par remplacement suivant un tableau de correspondances
function MyEncodeFunction($sString) {
# J'aime pas ça, mais là, c'est juste pratique
global $aCode;
# On instancie notre itérateur
# On se contente, pour l'exemple, d'une chaine en minuscules
$oSI = new StringIterator(strtolower($sString));
# On initialise la variable qui contient la chaine encodée
$sEncodedString = '';
foreach ($oSI as $sLetter) {
# On prend chaque lettre, et on la remplace par sa correspondante
# On récupère le code ascii de la lettre encodée
$sEncodedString .= chr($aCode[$sLetter]+96);
}
# On retourne la chaine trop bien codée ^^
return $sEncodedString;
}
echo '<br />';
print_r(MyEncodeFunction('bonjour'));
?>
Conclusion
C'est pas documenté, parce qu'il s'agit d'une classe qui implémente deux interfaces qui elles le sont : http://www.php.net/~helly/php/ext/spl/
J'ai mis le niveau à Initié : c'est pas vraiment compliqué, mais ça dépasse un peu la simple fonction qui additionne deux entiers...
Historique
- 06 novembre 2007 04:24:01 :
- Correction de la méthode seek() : plus sécurisée, lève des exceptions spécifiques suivant les erreurs.
- 06 novembre 2007 19:22:52 :
- Amélioration des performances pour les méthodes current() et valid() (merci à Kankrelune)
- 06 novembre 2007 19:27:01 :
- Remplacement de l'appel à la méthode count() par la propriété iLen
- 06 novembre 2007 19:28:46 :
- Faute de frappe ^^
- 07 novembre 2007 02:17:53 :
- Ajout d'un exemple ^^
- 07 avril 2008 06:14:44 :
- Ajout de la directionnalité
- 12 avril 2008 02:35:38 :
- Hum... J'avais juste oublié le deuxième argument dans la définition du constructeur...
Sources du même auteur
Sources de la même categorie
Sources en rapport avec celle ci
Commentaires et avis
Discussions en rapport avec ce code source dans le forum
Class POO retourné le nom de l'objet [ par MeTh ]
Bonjour,Comment retourné le nom de l'objet déclaré?exemple :$monobjet = new GridR();comment recuperé $monobjet dans ma class?Merci
templates avec poo [ par lesnes ]
bonjours je reprogramme totalement mon site en poo et je souhaiterai utiliser les templates mais l'on ne peut pas faire appel a une class exterieur a
Probleme en POO [ par pablor44 ]
Bonjour,alors voilà je vous explique mon probleme, je suis en train d'ecrire une classe en php pour mon site et je me retrouve dans la situation
Gestion membres via POO [ par FhX ]
Je me posais la question justement. Pour pouvoir faire une interface membre (donc : admin + membre + visiteur), dois-je faire ca en une seule classe ?
logiciel POO [ par kowal2205 ]
Je me pose la question de la création de mes classes dans un projet de taille moyenne car je ne trouve pas de logiciel à mon pied qui me per
Reflexion sur un schema de POO (gestion d'emploi du temps d'une UFR) [ par Franquito ]
Bonjour à tous ! Je dois réaliser un schema pour une application de programation orienté objet. L'application fait la gestion d'emploi du temps d'un
Comment ca marche cette petite bete? [ par craso ]
bonjour,en surfant, je suis tombé sur le site http://www.phpied.com/image-fun/ .Je souhaite qu'on m'explique comment trnsformer une image comme sur le
réécriture d'un script en POO, comment faire? [ par craso ]
Bonjour,j'ai développé cette petite application http://pipcorp.free.fr/Il s'agit d'une image clicable, le personnage centrale se positionne a l'endroi
[POO] Développer son Framework [ par Foxhive ]
Bonjour à tous, Cela fait longtemps que l'idée m'interesse mais j'ai jamais vraiment osé me jeter à l'eau. Mais là que je suis en vacance je me dis qu
[POO] Avis à tous ! [ par FhX ]
L'update de PHP5.2 est assez conséquent, je vous conseil de la lire :pY'a pas mal de trucs qui vont changer, surtout au niveux des interfaces (et tant
|
Téléchargements
Logiciels à télécharger sur le même thème :
Comparez les prix Nouvelle version
|