IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

[Tableaux] Conversion array -> object [FAQ]


Sujet :

Langage PHP

  1. #1
    Membre confirmé Avatar de Roromix
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    182
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Calvados (Basse Normandie)

    Informations forums :
    Inscription : Décembre 2005
    Messages : 182
    Par défaut [Tableaux] Conversion array -> object
    Il y a quelques jours j'ai eu l'idée de convertir mes tableaux en objets, tout dabord parce qu'avec les objets on a pas de soucis de guillemets puis bah le code est beaucoup plus cours. Mais est-ce que c'est un bon procédé ?

    Du coup, $_POST devient $post, $_GET devient $get et $_SESSION devient $session.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    function arrtoobj($arg_array) {
      $tmp = new stdClass;
      foreach ($arg_array as $key => $value) {
        if (is_array($value)) {
          $tmp->$key = arrtoobj($value);
        } else {
          $tmp->$key = $value;
        }
      }
      return $tmp;
    }
    Attention ça ne fonctionne pas avec des $key numériques.

    Exemple : $post = arrtoobj($_POST);

    Est-ce une bonne initiative ?

  2. #2
    Membre émérite

    Profil pro
    H4X0|2 @ YourLabs Business Service
    Inscrit en
    Octobre 2006
    Messages
    657
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : H4X0|2 @ YourLabs Business Service
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2006
    Messages : 657
    Par défaut
    Parlez-vous des magic_quotes par "soucis de guillemets" ?

  3. #3
    Membre confirmé Avatar de Roromix
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    182
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Calvados (Basse Normandie)

    Informations forums :
    Inscription : Décembre 2005
    Messages : 182
    Par défaut
    Nan, je parle des $array['nomdevaleur'] car quand il faut inclure ca dans une requete sql par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    "INSERT INTO ".$db->prefix."users (value) VALUES ('".$array['nomdevaleur']."')"
    Je préfére ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    "INSERT INTO ".$db->prefix."users (value) VALUES ('$array->nomdevaleur')"
    Je pense que ça peut être un script utile a mettre dans la FAQ php ou dans les sources.

  4. #4
    Membre émérite

    Profil pro
    H4X0|2 @ YourLabs Business Service
    Inscrit en
    Octobre 2006
    Messages
    657
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : H4X0|2 @ YourLabs Business Service
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2006
    Messages : 657
    Par défaut
    Il n'y a aucun soucis avec un tableau :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $ar = array("a"=>"b"); 
    echo "$ar[a]";
    // affiche b
    Mais c'est pls long à parser qu'avec une concaténation, car php doit "deviner" qu'il faut afficher une variable, en règle générale on peut affirmer que c'est une mauvaise pratique de code.

  5. #5
    Membre éprouvé
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 448
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 448
    Par défaut
    Salut,

    Quitte à vouloir faire ce que tu veux faire, voici une autre solution qui me parait plus idéale.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
     
    class arrtoobj
    {
    	protected $p_items;
     
    	public function __construct( $items )
    	{
    		if( is_array($items) )
    			$this->p_items = $items;
    		else
    			throw new Exception("L'argument attendu doit être de type Array");
    	}
     
    	public function __get( $prop )
    	{
    		if( isset( $this->p_items[$prop] ) )
    		{
    			if( is_array($this->p_items[$prop]) )
    				$this->p_items[$prop] = new arrtoobj( $this->p_items[$prop] );
    			return $this->p_items[$prop];
    		}
    		else
    			throw new Exception("Clé ".$prop." inconnue...");
    	}
     
    	public function __set( $prop , $value )
    	{
    		if( isset( $this->p_items[$prop] ) )
    			$this->p_items[$prop] = $value;
    		else
    			throw new Exception("Clé ".$prop." inconnue...");
    	}
    }
    J'y voit deux avantages.
    Premierement, si une clef n'existe pas dans le tableau cela provoque une exception. Donc on en est avertit.

    Deuxiemement, cette manière de procéder utilise le lazy loading, ou en gros *le chargement faineant*.
    L'idée derriere cela est de ne réaliser que les opérations strictement demandées.
    Il n'y à pas d'opérations inutile qui sont executées.
    En somme cette version ne lit pas toutes les clés du tableau en entrée pour les enregistrer autre part.
    Elle se contente de fournir la valeur demandée pour une clé N à un moment T.

    Bien sur dans bien des cas le gain de performances est minable, mais bon je trouve cela toujours plus élégant ; )
    Et dans certains cas, je pense que ce sera véritablement plus performant, ceci dit cela reste à vérifier car j'ai un peu peur de la copie de tableau....

    Quand au code en lui même je l'ai écrit on the fly, il peut donc subsister des erreurs d'écriture.
    Mais c'était juste pour illustrer une autre manière de procéder, une idée.

    Finalement, à la question, est-ce un bon procédé que de transformer les clefs d'un tableau en des propriétés d'objets ?
    Je pense foncierement que non. Car cela induit une perte d'informations pour toutes les clés numériques.

    Si tu tiens vraiment à utiliser un objet pour gérer tes tableaux, tourne toi vers ArrayObject qui est là pour cela.

    Exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    $get_ = new ArrayObject();
    $get_->exchangeArray( $_GET );
    voila.

    bye

Discussions similaires

  1. Réponses: 2
    Dernier message: 28/12/2007, 12h09
  2. [Tableaux] Affichage Array
    Par dafalri dans le forum Langage
    Réponses: 6
    Dernier message: 06/12/2005, 11h55
  3. création de tableaux avec Array() et élément 'fantome'
    Par Talieth dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 22/11/2005, 09h49
  4. [FLASH MX2004] Array et Object
    Par NeoMan dans le forum Flash
    Réponses: 2
    Dernier message: 12/10/2005, 21h22
  5. [Conversion]Probleme castexception object --> Integer
    Par lthomas dans le forum Général Java
    Réponses: 10
    Dernier message: 18/04/2005, 14h20

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo