Accueil > > > [PHP5.1] STRING ITERATOR
[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/BitTorrentSpecifi cation#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
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
|
Derniers Blogs
UNE JOLIE-HORLOGE ET PAS QU'UN PEU !UNE JOLIE-HORLOGE ET PAS QU'UN PEU ! par neodante
Pour les possesseurs d'iPhone, ça y est Bijin Tokei - qui se traduit littéralement en Français par " Jolie Horloge " - est arrivé et GRATUITEMENT s'il vous plaît ! Après la version Tokyo, Hokkaido, night club, racing, Gal, "pour les mademoiselles'", . voi...
Cliquez pour lire la suite de l'article par neodante TECHDAYS PARIS 2010 : CONNECTEZ VOS DONNéES à SHAREPOINT 2010 AVEC LES BUSINESS CONNECTIVITY SERVICESTECHDAYS PARIS 2010 : CONNECTEZ VOS DONNéES à SHAREPOINT 2010 AVEC LES BUSINESS CONNECTIVITY SERVICES par ROMELARD Fabrice
Animé par: Gaetan Bouveret et Julien Chomarat Business Connectivity Services (BCS) est dans SharePoint 2010 la version 2 de Business Data Catalog (BDC dans SharePoint 2007). Il s'agit de la solution permettant de visualiser des données provenan...
Cliquez pour lire la suite de l'article par ROMELARD Fabrice [DIVERS] SUIVRE VOS SéRIES PRéFéRéS SUR LA TOILE[DIVERS] SUIVRE VOS SéRIES PRéFéRéS SUR LA TOILE par orion
Comme de nombreux geek, je suis un grand amateur de série TV et je rate régulièrement des épisodes de mes séries préférés. Une solution s'offre à vous avec ce merveilleux site : Tv Gorge - www.tvgorge.com Moteur de recherche à l'appui, vous pouvez ...
Cliquez pour lire la suite de l'article par orion TECHDAYS PARIS 2010 : LA BI DANS SHAREPOINT 2010TECHDAYS PARIS 2010 : LA BI DANS SHAREPOINT 2010 par ROMELARD Fabrice
Animé par: Vincent Bellet et Baptiste Giraudier La BI dans SharePoint 2010, Les nouveaux services d'application dans SP2010 et SQL Server Reporting services 2008 R2. La BI dans SharePoint est généralisée pour tous afin de permettre à tous les coll...
Cliquez pour lire la suite de l'article par ROMELARD Fabrice
Forum
HTML VERS PDFHTML VERS PDF par spike911
Cliquez pour lire la suite par spike911
Logiciels
DB-MAIN (9.1.0)DB-MAIN (9.1.0)DB-MAIN is a data-modeling and data-architecture tool. It is designed to help developers and anal... Cliquez pour télécharger DB-MAIN Xilisoft DPG Convertisseur (5.1.37.0120)XILISOFT DPG CONVERTISSEUR (5.1.37.0120)Xilisoft DPG Convertisseur offre aux fans de Nintendo DS une bonne solution leur permettant de dé... Cliquez pour télécharger Xilisoft DPG Convertisseur GraphicsGale (2.01.01)GRAPHICSGALE (2.01.01)GraphicsGale est un logiciel de PixelArt avec de nombreuse fonctionnalités permettant de réalisé ... Cliquez pour télécharger GraphicsGale Architecte 3D (Platinum 2010)ARCHITECTE 3D (PLATINUM 2010)Architecte 3D Platinium vous permet de concevoir facilement les plans votre future maison, de l'é... Cliquez pour télécharger Architecte 3D TeamViewer 5 (TeamViewer 5)TEAMVIEWER 5 (TEAMVIEWER 5)Dépanner un ami,expliquer une manipulation devient un jeu d'enfant.
Prise en main d'un autre ord... Cliquez pour télécharger TeamViewer 5
|