/** * Auteur : Rastapopoulos * Filtre ajoutant une valeur dans une clé d'un tableau. * #TABLEAU| {a/b/c, valeur, #CONDITION} * - si la clé "c" est un tableau : on ajoute "valeur" à la fin * - si la clé "c" n'existe pas : on crée une liste et on met la valeur dedans * - si la clé "c" est un scalaire : on ne fait rien * - si les clés autres que la dernière n'existent pas : on en fait des tableaux en cascade * * Remarques : * - Fait en écriture ce que fait table_valeur en lecture * - Exemple d'utilisation : * [(#SET{item, [(#GET{item}|push_table_valeur{data, [(#ARRAY{name,lat, value,#LAT, prompt <:gis:lat:>})]})]})] * * @filtre * @param array|object|string $table * 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. * @param string $chemin * Une suite de clés ou de propriétés d'objet, séparées par le caractère "/" : un/element/ici * @param mixed $valeur * Une valeur à ajouter au paramètre précédent. * @param mixed $condition=true * Une valeur quelconque qui sera testée de manière boléenne pour savoir si on fait le traitement ou pas. * @return array|object * Retourne le tableau ou l'objet initial, modifié suivant les paramètres. */ function push_table_valeur($table, $chemin, $valeur, $condition=true) { // Si la condition est fausse, on ne fait rien du tout if ($condition){ $table = is_string($table) ? @unserialize($table) : $table; $element_a_modifier =& $table; // S'il y a un emplacement donné, on cherche si c'est un tableau if ($chemin and is_string($chemin) and $chemin = explode('/', $chemin) and is_array($chemin)){ foreach ($chemin as $cle){ // On ne fait que s'il la clé vaut quelque chose if ($cle !== ''){ // Si c'est un tableau, on vérifie si la clé existe if (is_array($element_a_modifier)) { // Si la clé n'existe pas : on met un tableau vide qui se remplira if (!isset($element_a_modifier[$cle])){ $element_a_modifier[$cle] = array(); } $element_a_modifier =& $element_a_modifier[$cle]; } // Si c'est un objet on vérifie si la propriété existe elseif (is_object($element_a_modifier)) { // Si la propriété n'existe pas : on met un tableau vide qui se remplira if (!isset($element_a_modifier->$cle)){ $element_a_modifier->$cle = array(); } $element_a_modifier =& $element_a_modifier->$cle; } } } } // Maintenant on est au bon endroit de ce qu'on veut modifier : // Si l'élément à modifier est bien un tableau : on push la valeur dedans if (is_array($element_a_modifier)){ array_push($element_a_modifier, $valeur); } // Sinon (si c'est un scalaire) on ne fait rien et il faudra utiliser set_table_valeur() par exemple } return $table; }