Faire la somme de la propriété d'un groupe d'objet

Eléphanteau du PHP | 23 Messages

29 août 2011, 15:59

Bonjour,

J'ai un array qui contient des objets de même nature. Chaque objet a une propriété «valeur»;
je voudrais faire la somme de tout les objets->valeur pour obtenir la valeur total de tout mes objets.

Évidemment je pourrais utiliser foreach (allObjets as oneObjet) et incrémenter une variable de valeur totale, mais je me demandais s'il existe une fonction prédéfinie pour y parvenir?

Merci beaucoup

Eléphant du PHP | 127 Messages

29 août 2011, 16:42

Salut,

oui c'est possible mais pas sûr que ce soit très intuitif. Voilà un code fonctionnel :
<?php

// Classe MonObj
class MonObj {
	
	private $value = 0;
	
	public function __construct($value) { $this -> value = $value; }
	public function getValue() { return $this -> value; }
	
}

// Tableau contenant les objets
$tab = array(
    new MonObj(4),
    new MonObj(7),
    new MonObj(1),
    new MonObj(2)
);

// Fonction permettant d'extraire la valeur des objets
function getValue($obj) {
	return $obj -> getValue();
}

// Total
echo array_sum(array_map('getValue', $tab));

Eléphanteau du PHP | 23 Messages

29 août 2011, 16:46

Merci, je conaissais pas array_map

Très utile :)

Eléphant du PHP | 127 Messages

29 août 2011, 16:57

Par extension, voici une petite classe contenant une seule méthode statique permettant de faire exactement la même chose mais plus réutilisable :
<?php
// Classe MonObj
class MonObj {
	private $value = 0;
	
	public function __construct($value) { $this -> value = $value; }
	public function getValue() { return $this -> value; }
}

/**
 * Classe permettant d'additionner les valeurs d'une propriété d'un objet
 */
class AddObj {
	
	/**
	 * Méthode privé utilisée pour réaliser la somme des objets
	 * @param unknown_type $property
	 */
	private static function _getValue($obj, $property) {
		return $obj -> $property();
	}
	
	/**
	 * Ajoute les propriétés d'une liste d'objets donnés
	 * @param $array Le tableau contenant les objets
	 * @param $property La propriété à utiliser pour effectuer l'addition
	 */
    public static function add(Array $array, $property) {
		return array_sum(array_map(array(__CLASS__, '_getValue'), $array, array_fill(0, count($array), $property)));
	}
	
} 

// Tableau contenant les objets
$tab = array(
    new MonObj(4),
    new MonObj(7),
    new MonObj(1),
    new MonObj(2)
);

// Total
echo AddObj :: add($tab, 'getValue');