Accueil > > > HASHMAP EN PHP AVEC LA SPL
HASHMAP EN PHP AVEC LA SPL
Information sur la source
Description
Bonjour,
[ATTENTION code en PHP 5.3] (methode get_called_class non supporté dans les versions précédentes)
J'ai voulu recréer le system de HashMap Java (enfin tres vite fais, et je me rappel plus si c'est le hashmap ou le vecteur c'est bien loin mes cours de JAVA ^^), le but principal était de me familliariser avec la spl.
Cette source utilise les interfaces ArrayAccess, IteratorAggregate, Countable
Elle utilise les classes ArrayIterator, LimiteIterator de la spl
Source
- <?php
- namespace System::Iterator
-
- /**
- * @abstract
- * @name HashMapIterator
- * @author Dorian
- * @since 09/12/2008
- * @version 1.0.0
- */
- abstract class MapIterator implements Iterator, Countable, ArrayAccess
- {
- /**
- * Tableau MAP
- *
- * @access protected
- * @var array
- */
- protected $_aMap;
-
- /**
- * Nombre d'élément du tableau
- *
- * @access private
- * @var integer
- */
- private $_iCount;
-
- /**
- * Index de l'itérateur
- *
- * @access private
- * @var integer
- */
- private $_iIndex;
-
- /**
- * Défini si on peut modifier les éléments du tableau
- *
- * @access private
- * @var boolean
- */
- private $_bWritable;
-
- /**
- * Constructeur de la classe
- * Initialise le tableau et le compteur
- *
- * @access public
- * @param array $aMap
- * @param boolean $bWritable
- * @return void
- */
- public function __construct(array $aMap = array(), $bWritable = true)
- {
- $this->_iIndex = 0;
- $this->_aMap = array();
- $this->_bWritable = $bWritable;
-
- if( count($aMap) > 0 )
- {
- $this->add($aMap);
- }
-
- $this->_iCount = count($this->_aMap);
- }
-
- /**
- * Retourne le nombre d'élément du tableau
- *
- * @access public
- * @return integer
- */
- public function count()
- {
- return $this->_iCount;
- }
-
- /**
- * Retourne l'élément suivant
- *
- * @access public
- * @return mixed
- */
- public function current()
- {
- return current($this->_aMap);
- }
-
- /**
- * Retourne la clé de l'élément courant
- *
- * @access public
- * @return mixed
- */
- public function key()
- {
- return key($this->_aMap);
- }
-
- /**
- * Passe le pointeur sur l'élément suivant
- *
- * @access public
- * @return void
- */
- public function next()
- {
- next($this->_aMap);
- $this->_iIndex++;
- }
-
- /**
- * Met le pointeur au début du tableau
- *
- * @access public
- * @return void
- */
- public function rewind()
- {
- reset($this->_aMap);
- $this->_iIndex = 0;
- }
-
- /**
- * Test si l'iterateur est valide
- *
- * @access public
- * @return boolean
- */
- public function valid()
- {
- return $this->_iIndex < $this->_iCount;
- }
-
- /**
- * Test l'existance de l'élément dans le tableau
- *
- * @access public
- * @param mixed $mOffset
- * @return boolean
- */
- public function offsetExists($mOffset)
- {
- return array_key_exists($mOffset, $this->_aMap);
- }
-
- /**
- * Retourne un élément du tableau
- *
- * @param mixed $mOffset
- * @return mixed
- */
- public function offsetGet($mOffset)
- {
- return $this->get($mOffset);
- }
-
- /**
- * Modifie un élément du tableau
- *
- * @access public
- * @param mixed $mOffset
- * @param mixed $mValue
- * @return void
- */
- public function offsetSet($mOffset, $mValue)
- {
- $this->set($mOffset, $mValue);
- }
-
- /**
- * Efface un élément du tableau
- *
- * @access public
- * @param mixed $mKey
- * @return void
- */
- public function offsetUnset($mOffset)
- {
- return $this->remove($mOffset);
- }
-
- /**
- * Ajoute un tableau
- *
- * @access public
- * @param array $aMap
- * @return void
- */
- public function add(array $aMap)
- {
- $sClass = get_called_class();
-
- foreach( $aMap as $mKey => $mValue )
- {
- if( is_array($mValue) )
- {
- $this->_aMap[$mKey] = new $sClass($mValue);
- }
- else
- {
- $this->_aMap[$mKey] = $mValue;
- }
- }
-
- $this->_iCount = count($this->_aMap);
- }
-
- /**
- * Retourne un élément du tableau
- *
- * @access public
- * @param mixed $mKey
- * @return mixed
- */
- public function get($mKey)
- {
- if( array_key_exists($mKey, $this->_aMap) )
- {
- return $this->_aMap[$mKey];
- }
-
- return null;
- }
-
- /**
- * Ajoute un élément au tableau
- *
- * @access public
- * @param mixed $mKey
- * @param mixed $mValue
- * @return void
- */
- public function set($mKey, $mValue)
- {
- if( false === $this->_bWritable )
- {
- throw new Exception('Vous n\'avez pas les droits d\'écriture.', E_ERROR);
- }
-
- $sClass = get_called_class();
-
- if( is_array($mValue) )
- {
- $this->_aMap[$mKey] = new $sClass($mValue);
- }
- else
- {
- $this->_aMap[$mKey] = $mValue;
- }
-
- $this->_iCount = count($this->_aMap);
- }
-
- /**
- * Retourne un tableau contenant les clé
- *
- * @access public
- * @return array
- */
- public function getKeys()
- {
- return array_keys($this->_aMap);
- }
-
- /**
- * Combine une autre instance de la class
- *
- * @access public
- * @param object $merge
- * @return object
- */
- public function merge($oMerge)
- {
- $sClass = get_called_class();
- $oReflexion = new ReflectionClass($sClass);
-
- if(! $oReflexion->isSubclassOf($this) )
- {
- throw new Exception('Vous devez passer en paramètre une classe enfant de MapIterator.', E_ERROR);
- }
-
- foreach($oMerge as $mKey => $mItem)
- {
- if(array_key_exists($mKey, $this->_aMap))
- {
- if($mItem instanceof $sClass && $this->$mKey instanceof $sClass)
- {
- $this->$mKey = $this->$mKey->merge($mItem);
- }
- else
- {
- $this->$mKey = $mItem;
- }
- }
- else
- {
- $this->$mKey = $mItem;
- }
- }
-
- return $this;
- }
-
- /**
- * Efface un élément du tableau
- *
- * @access public
- * @param mixed $mKey
- * @return object|boolean
- */
- public function remove($mKey)
- {
- if( false === $this->_bWritable )
- {
- throw new Exception('Vous n\'avez pas les droits d\'écriture.', E_ERROR);
- }
-
- if(array_key_exists($mKey, $this->_aMap))
- {
- unset($this->_aMap[$mKey]);
- $this->_iCount = count($this->_aMap);
-
- return $this;
- }
-
- return false;
- }
-
- /**
- * Clone l'object
- *
- * @access public
- * @return void
- */
- public function __clone()
- {
- $aArray = array();
- $sClass = get_called_class();
-
- foreach( $this->_aMap as $mKey => $mValue )
- {
- if( $mValue instanceof $sClass )
- {
- $aArray[$mKey] = clone $mValue;
- }
- else
- {
- $aArray[$mKey] = $mValue;
- }
- }
-
- $this->_aMap = $aArray;
- }
-
- /**
- * Transforme l'object en tableau
- *
- * @access public
- * @return array
- */
- public function __toArray()
- {
- $aArray = array();
-
- foreach( $this->_aMap as $mKey => $mValue )
- {
- if( $mValue instanceof MapIterator )
- {
- $aArray[$mKey] = $mValue->__toArray();
- }
- else
- {
- $aArray[$mKey] = $mValue;
- }
- }
-
- return $aArray;
- }
-
- /**
- * Test si l'élément existe
- *
- * @access public
- * @param mixed $mKey
- * @return boolean
- */
- public function __isset($mKey)
- {
- return isset($this->_aMap[$mKey]);
- }
-
- /**
- * Efface un élément du tableau
- *
- * @access public
- * @param mixed $mKey
- * @return object
- */
- public function __unset($mKey)
- {
- if( false === $this->_bWritable )
- {
- throw new Exception('Vous n\'avez pas les droits d\'écriture.', E_ERROR);
- }
-
- return $this->remove($mKey);
- }
-
- /**
- * Retourne un élément du tableau
- *
- * @access public
- * @param mixed $mKey
- * @return mixed
- */
- abstract public function __get($mKey);
-
- /**
- * Ajoute un élément au tableau
- *
- * @access public
- * @param mixed $mKey
- * @param mixed $mValue
- * @return void
- */
- abstract public function __set($mKey, $mValue);
- }
- ?>
-
- <?php
- namespace System::Collection
-
- /**
- * @name HashMap
- * @author aberthelot
- * @copyright Copyright (c) 2008, Alexandre Berthelot
- * @since 07/12/2008
- * @package System::Collection
- * @version 4.0.0 - AXB - 07/12/2008
- */
- class HashMap extends MapIterator
- {
- /**
- * Constructeur de la classe
- * Initialise le HashMap
- *
- * @access public
- * @param array $aMap
- * @return void
- */
- public function __construct(array $aMap = array())
- {
- parent::__construct($aMap);
- }
-
- /**
- * Modifie un élément de la config
- *
- * @access public
- * @param mixed $mKey
- * @param mixed $mValue
- * @return object
- */
- public function __set($mKey, $mValue)
- {
- $this->set($mKey, $mValue);
- }
-
- /**
- * Retourne un élément de la configuration
- *
- * @access public
- * @param mixed $mKey
- * @return mixed var
- */
- public function __get($mKey)
- {
- return $this->get($mKey);
- }
- }
- ?>
<?php
namespace System::Iterator
/**
* @abstract
* @name HashMapIterator
* @author Dorian
* @since 09/12/2008
* @version 1.0.0
*/
abstract class MapIterator implements Iterator, Countable, ArrayAccess
{
/**
* Tableau MAP
*
* @access protected
* @var array
*/
protected $_aMap;
/**
* Nombre d'élément du tableau
*
* @access private
* @var integer
*/
private $_iCount;
/**
* Index de l'itérateur
*
* @access private
* @var integer
*/
private $_iIndex;
/**
* Défini si on peut modifier les éléments du tableau
*
* @access private
* @var boolean
*/
private $_bWritable;
/**
* Constructeur de la classe
* Initialise le tableau et le compteur
*
* @access public
* @param array $aMap
* @param boolean $bWritable
* @return void
*/
public function __construct(array $aMap = array(), $bWritable = true)
{
$this->_iIndex = 0;
$this->_aMap = array();
$this->_bWritable = $bWritable;
if( count($aMap) > 0 )
{
$this->add($aMap);
}
$this->_iCount = count($this->_aMap);
}
/**
* Retourne le nombre d'élément du tableau
*
* @access public
* @return integer
*/
public function count()
{
return $this->_iCount;
}
/**
* Retourne l'élément suivant
*
* @access public
* @return mixed
*/
public function current()
{
return current($this->_aMap);
}
/**
* Retourne la clé de l'élément courant
*
* @access public
* @return mixed
*/
public function key()
{
return key($this->_aMap);
}
/**
* Passe le pointeur sur l'élément suivant
*
* @access public
* @return void
*/
public function next()
{
next($this->_aMap);
$this->_iIndex++;
}
/**
* Met le pointeur au début du tableau
*
* @access public
* @return void
*/
public function rewind()
{
reset($this->_aMap);
$this->_iIndex = 0;
}
/**
* Test si l'iterateur est valide
*
* @access public
* @return boolean
*/
public function valid()
{
return $this->_iIndex < $this->_iCount;
}
/**
* Test l'existance de l'élément dans le tableau
*
* @access public
* @param mixed $mOffset
* @return boolean
*/
public function offsetExists($mOffset)
{
return array_key_exists($mOffset, $this->_aMap);
}
/**
* Retourne un élément du tableau
*
* @param mixed $mOffset
* @return mixed
*/
public function offsetGet($mOffset)
{
return $this->get($mOffset);
}
/**
* Modifie un élément du tableau
*
* @access public
* @param mixed $mOffset
* @param mixed $mValue
* @return void
*/
public function offsetSet($mOffset, $mValue)
{
$this->set($mOffset, $mValue);
}
/**
* Efface un élément du tableau
*
* @access public
* @param mixed $mKey
* @return void
*/
public function offsetUnset($mOffset)
{
return $this->remove($mOffset);
}
/**
* Ajoute un tableau
*
* @access public
* @param array $aMap
* @return void
*/
public function add(array $aMap)
{
$sClass = get_called_class();
foreach( $aMap as $mKey => $mValue )
{
if( is_array($mValue) )
{
$this->_aMap[$mKey] = new $sClass($mValue);
}
else
{
$this->_aMap[$mKey] = $mValue;
}
}
$this->_iCount = count($this->_aMap);
}
/**
* Retourne un élément du tableau
*
* @access public
* @param mixed $mKey
* @return mixed
*/
public function get($mKey)
{
if( array_key_exists($mKey, $this->_aMap) )
{
return $this->_aMap[$mKey];
}
return null;
}
/**
* Ajoute un élément au tableau
*
* @access public
* @param mixed $mKey
* @param mixed $mValue
* @return void
*/
public function set($mKey, $mValue)
{
if( false === $this->_bWritable )
{
throw new Exception('Vous n\'avez pas les droits d\'écriture.', E_ERROR);
}
$sClass = get_called_class();
if( is_array($mValue) )
{
$this->_aMap[$mKey] = new $sClass($mValue);
}
else
{
$this->_aMap[$mKey] = $mValue;
}
$this->_iCount = count($this->_aMap);
}
/**
* Retourne un tableau contenant les clé
*
* @access public
* @return array
*/
public function getKeys()
{
return array_keys($this->_aMap);
}
/**
* Combine une autre instance de la class
*
* @access public
* @param object $merge
* @return object
*/
public function merge($oMerge)
{
$sClass = get_called_class();
$oReflexion = new ReflectionClass($sClass);
if(! $oReflexion->isSubclassOf($this) )
{
throw new Exception('Vous devez passer en paramètre une classe enfant de MapIterator.', E_ERROR);
}
foreach($oMerge as $mKey => $mItem)
{
if(array_key_exists($mKey, $this->_aMap))
{
if($mItem instanceof $sClass && $this->$mKey instanceof $sClass)
{
$this->$mKey = $this->$mKey->merge($mItem);
}
else
{
$this->$mKey = $mItem;
}
}
else
{
$this->$mKey = $mItem;
}
}
return $this;
}
/**
* Efface un élément du tableau
*
* @access public
* @param mixed $mKey
* @return object|boolean
*/
public function remove($mKey)
{
if( false === $this->_bWritable )
{
throw new Exception('Vous n\'avez pas les droits d\'écriture.', E_ERROR);
}
if(array_key_exists($mKey, $this->_aMap))
{
unset($this->_aMap[$mKey]);
$this->_iCount = count($this->_aMap);
return $this;
}
return false;
}
/**
* Clone l'object
*
* @access public
* @return void
*/
public function __clone()
{
$aArray = array();
$sClass = get_called_class();
foreach( $this->_aMap as $mKey => $mValue )
{
if( $mValue instanceof $sClass )
{
$aArray[$mKey] = clone $mValue;
}
else
{
$aArray[$mKey] = $mValue;
}
}
$this->_aMap = $aArray;
}
/**
* Transforme l'object en tableau
*
* @access public
* @return array
*/
public function __toArray()
{
$aArray = array();
foreach( $this->_aMap as $mKey => $mValue )
{
if( $mValue instanceof MapIterator )
{
$aArray[$mKey] = $mValue->__toArray();
}
else
{
$aArray[$mKey] = $mValue;
}
}
return $aArray;
}
/**
* Test si l'élément existe
*
* @access public
* @param mixed $mKey
* @return boolean
*/
public function __isset($mKey)
{
return isset($this->_aMap[$mKey]);
}
/**
* Efface un élément du tableau
*
* @access public
* @param mixed $mKey
* @return object
*/
public function __unset($mKey)
{
if( false === $this->_bWritable )
{
throw new Exception('Vous n\'avez pas les droits d\'écriture.', E_ERROR);
}
return $this->remove($mKey);
}
/**
* Retourne un élément du tableau
*
* @access public
* @param mixed $mKey
* @return mixed
*/
abstract public function __get($mKey);
/**
* Ajoute un élément au tableau
*
* @access public
* @param mixed $mKey
* @param mixed $mValue
* @return void
*/
abstract public function __set($mKey, $mValue);
}
?>
<?php
namespace System::Collection
/**
* @name HashMap
* @author aberthelot
* @copyright Copyright (c) 2008, Alexandre Berthelot
* @since 07/12/2008
* @package System::Collection
* @version 4.0.0 - AXB - 07/12/2008
*/
class HashMap extends MapIterator
{
/**
* Constructeur de la classe
* Initialise le HashMap
*
* @access public
* @param array $aMap
* @return void
*/
public function __construct(array $aMap = array())
{
parent::__construct($aMap);
}
/**
* Modifie un élément de la config
*
* @access public
* @param mixed $mKey
* @param mixed $mValue
* @return object
*/
public function __set($mKey, $mValue)
{
$this->set($mKey, $mValue);
}
/**
* Retourne un élément de la configuration
*
* @access public
* @param mixed $mKey
* @return mixed var
*/
public function __get($mKey)
{
return $this->get($mKey);
}
}
?>
Historique
- 09 décembre 2008 18:17:48 :
- .
- 09 décembre 2008 18:19:54 :
- .
- 10 décembre 2008 14:56:40 :
- Les méthodes de l'iterateur sont maintenant dans la classe abstraite HashMapIterator.
Toutes les méthodes pour modifier le HashMap sont dans la classe HashMap
- 16 décembre 2008 12:34:58 :
- Modification de la classe pour gérer la récursivié
- 16 décembre 2008 12:36:33 :
- .
- 04 janvier 2009 04:24:55 :
- .
- 04 janvier 2009 04:26:02 :
- .
- 04 janvier 2009 04:27:43 :
- PHP 5.3
- 04 janvier 2009 04:29:05 :
- Ajout des namespaces
Sources du même auteur
Sources de la même categorie
Commentaires et avis
Discussions en rapport avec ce code source dans le forum
[SPL] Une variable objet comme clé de l'interface Iterator [ par LocalStone ]
Salut à tous, Alors voilà ma question : est-il possible d'utiliser l'interface Iterator (ou tout interface qui permettent le parcours d'un objet avec
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
orienté objet en php [ par am1ra2 ]
bonjour, j'ai des connaissances sur la POO en php mais je ne connais pas comment implimenter la POO dans mes applications.
Probleme POO [ par cedriclomb ]
Bonjour,Aujourd'hui au programme casse tete chinois ! :DVoila j'ai une classe B qui est une extends de Aun objet $b=new B;et ensuite $b->loadModule
problème sur free [ par nemetos ]
Bonjour,j'ai développé un site en local avec easy php 1.8. Il fonctionne très bien. Seulement lorsque je l'ai uploadé sur free il y a un bug. Voici co
Panier particulier ! HELP !! [ par christianp88 ]
Bonjour,Je voudrais développer un site avec un panier. Jusque là rien de bien particulier pour vous.Maintenant je vais expliquer le fonctionnement de
égaliter entre 2 objets [ par nemetos ]
Bonjour,je crée un objet. Après l'avoir initialiser, je veux le mettre dans un tableau.Voici ma procédure :$i=0;$a = new objet1;$b = Array(new objet1)
probleme d'affectation de variable dans un objet [ par nemetos ]
Bonjour,je crée l'objet suivant : class calendrier { var $date_courante; var $annee_courante; var $mois_courant; var $jour_courant;
formulaire objet [ par jasou62114 ]
bonjour à tous, j'ai un soucis, je n'arrive pas à faire une liste déroulante en php objet. J'ai repris un projet qui as déjà été codé à 99% et je l'a
Problème à la création d'un objet [ par BooletMan ]
Bonjour bonjour ! A partir d'un XML, je récupère sous forme d'objet les informations concernant un fichier (son nom, si ce fichier est requis, s'il f
|
Derniers Blogs
IMAGINE CUP 2012, MAKE A SIGN EN FINALEIMAGINE CUP 2012, MAKE A SIGN EN FINALE par junarnoalg
Voilà qui est fait, la nouvelle est officielle ! L'équipe belge "Make a Sign" va au pays des kangourous défendre son projet dans la catégorie Software Design. http://www.imaginecup.com/CompetitionsContent/Competition/WorldwideFinalists.aspx V...
Cliquez pour lire la suite de l'article par junarnoalg KINECT 1.5 IS OUT !KINECT 1.5 IS OUT ! par Vko
La version 1.5 du Kinect For Microsoft vient tout juste de sortir ! Plein de nouveautés: Tracking de squelette en Near Mode Détection en position assise Détection faciale avec un SDK dédié Documentation et des guideline (enfin) Un out...
Cliquez pour lire la suite de l'article par Vko LES ACTUALITéS DE LA SEMAINE SUR C2I.FR (14 MAI - 20 MAI) LES ACTUALITéS DE LA SEMAINE SUR C2I.FR (14 MAI - 20 MAI) par richardc
Mise à jour des Web API du 14 Mai
Réservez dès maintenant votre journée du 20 juin pour le Windows Azure Dev Camp 2012 à Paris
Mise à jour de Team Foundation Service
MechCommander 2 sur Windows 8
Entity Framework 5 Release Candidate e...
Cliquez pour lire la suite de l'article par richardc REACTIVE EXTENSIONS : CONSOMMER DES SERVICES AVEC RX PARTIE 3, LES PIèGES à éVITERREACTIVE EXTENSIONS : CONSOMMER DES SERVICES AVEC RX PARTIE 3, LES PIèGES à éVITER par Groc
Une mauvaise utilisation de rx lors de l'écriture d'une couche d'accès à des services peut conduire à des cas embarassants avec des erreurs mal gérées, des appels qui ne partent lorsqu'ils le devraient, et même des résultats incorrects . le tout nuis...
Cliquez pour lire la suite de l'article par Groc SHAREPOINT BLOG SITE, PROBLèME D'ARCHIVESSHAREPOINT BLOG SITE, PROBLèME D'ARCHIVES par junarnoalg
Dernièrement, nous avons migré le site
myTIC
vers un nouveau serveur SharePoint 2010. Dans les contenus que nous vouloins récupérer, nous avions un certain nombre de blogs.
Nous avons utilisé les commandes Power...
Cliquez pour lire la suite de l'article par junarnoalg
Forum
GOOGLE MAPGOOGLE MAP par fatmanajjar
Cliquez pour lire la suite par fatmanajjar
Logiciels
sDEVIS-FACTURES vlPRO (8.1.0.3)SDEVIS-FACTURES VLPRO (8.1.0.3)sDEVIS-FACTURES vlPRO a été mis au point pour les particuliers, créateurs, entrepreneurs, artisa... Cliquez pour télécharger sDEVIS-FACTURES vlPRO 974 Application Server (12.2.4.6)974 APPLICATION SERVER (12.2.4.6)Développez de puissantes applications dans un environnement de 'cloud computing', clusterisé, séc... Cliquez pour télécharger 974 Application Server vPicture (1.4.2.1)VPICTURE (1.4.2.1)Avec vPicture, hébergez vos images facilement et rapidement.
vPicture est un utilitaire simple, ... Cliquez pour télécharger vPicture Easy-Planning (2.2.1.6)EASY-PLANNING (2.2.1.6)Easy-Planning permet de créer des plannings sous la représentation de diagrammes et est adapté au... Cliquez pour télécharger Easy-Planning COM-BACKUP (2.0)COM-BACKUP (2.0)
COM-BACKUP est un logiciel de sauvegarde qui permet de planifier les sauvegardes de vos dossiers ...
Cliquez pour télécharger COM-BACKUP
|