Carnet Wiki

push_table_valeur

Version 3 — Mars 2015 JLuc

Filtre proposé sur spip dev

  1. /**
  2.  * Auteur : Rastapopoulos
  3.  * Filtre ajoutant une valeur dans une clé d'un tableau.
  4.  * #TABLEAU|    {a/b/c, valeur, #CONDITION}
  5.  * - si la clé "c" est un tableau : on ajoute "valeur" à la fin
  6.  * - si la clé "c" n'existe pas : on crée une liste et on met la valeur dedans
  7.  * - si la clé "c" est un scalaire : on ne fait rien
  8.  * - si les clés autres que la dernière n'existent pas : on en fait des tableaux en cascade
  9.  *
  10.  * Remarques :
  11.  * - Fait en écriture ce que fait table_valeur en lecture
  12.  * - Exemple d'utilisation :
  13.  *  [(#SET{item, [(#GET{item}|push_table_valeur{data, [(#ARRAY{name,lat, value,#LAT, prompt <:gis:lat:>})]})]})]
  14.  *
  15.  * @filtre
  16.  * @param array|object|string $table
  17.  *     Table ou objet dont on veut modifier ou augmenter une des clés/propriétés. Peut être une chaîne à désérialiser contenant ce tableau ou cet objet.
  18.  * @param string $chemin
  19.  *     Une suite de clés ou de propriétés d'objet, séparées par le caractère "/" : un/element/ici
  20.  * @param mixed $valeur
  21.  *     Une valeur à ajouter au paramètre précédent.
  22.  * @param mixed $condition=true
  23.  *     Une valeur quelconque qui sera testée de manière boléenne pour savoir si on fait le traitement ou pas.
  24.  * @return array|object
  25.  *     Retourne le tableau ou l'objet initial, modifié suivant les paramètres.
  26.  */
  27. function push_table_valeur($table, $chemin, $valeur, $condition=true) {
  28.         // Si la condition est fausse, on ne fait rien du tout
  29.         if ($condition){
  30.                 $table = is_string($table) ? @unserialize($table) : $table;
  31.                 $element_a_modifier =& $table;
  32.                
  33.                 // S'il y a un emplacement donné, on cherche si c'est un tableau
  34.                 if ($chemin and is_string($chemin) and $chemin = explode('/', $chemin) and is_array($chemin)){
  35.                         foreach ($chemin as $cle){
  36.                                 // On ne fait que s'il la clé vaut quelque chose
  37.                                 if ($cle !== ''){
  38.                                         // Si c'est un tableau, on vérifie si la clé existe
  39.                                         if (is_array($element_a_modifier)) {
  40.                                                 // Si la clé n'existe pas : on met un tableau vide qui se remplira
  41.                                                 if (!isset($element_a_modifier[$cle])){
  42.                                                         $element_a_modifier[$cle] = array();
  43.                                                 }
  44.                                                 $element_a_modifier =& $element_a_modifier[$cle];
  45.                                         }
  46.                                         // Si c'est un objet on vérifie si la propriété existe
  47.                                         elseif (is_object($element_a_modifier)) {
  48.                                                 // Si la propriété n'existe pas : on met un tableau vide qui se remplira
  49.                                                 if (!isset($element_a_modifier->$cle)){
  50.                                                         $element_a_modifier->$cle = array();
  51.                                                 }
  52.                                                 $element_a_modifier =& $element_a_modifier->$cle;
  53.                                         }
  54.                                 }
  55.                         }
  56.                 }
  57.                
  58.                 // Maintenant on est au bon endroit de ce qu'on veut modifier :
  59.                
  60.                 // Si l'élément à modifier est bien un tableau : on push la valeur dedans
  61.                 if (is_array($element_a_modifier)){
  62.                         array_push($element_a_modifier, $valeur);
  63.                 }
  64.                 // Sinon (si c'est un scalaire) on ne fait rien et il faudra utiliser set_table_valeur() par exemple
  65.                
  66.         }
  67.         return $table;
  68. }

Télécharger