Carnet Wiki

push_table_valeur

Version 2 — Mars 2015 JLuc

Filtre proposé sur spip dev

/**
 * 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;
}