ArrayPieceSquadro.php 4,3 ko
Newer Older
/**
 * Classe représentant une collection de pièces Squadro.
 * 
 * Cette classe implémente les interfaces ArrayAccess et Countable, permettant de manipuler
 * les pièces comme un tableau, tout en offrant des méthodes spécifiques pour
 * ajouter, supprimer, convertir et manipuler les données des pièces.
 */
class ArrayPieceSquadro implements ArrayAccess, Countable {
    /**
     * Tableau contenant les instances de PieceSquadro.
     * 
     * @var PieceSquadro[]
     */
    private array $pieces = [];

    /**
     * Ajoute une pièce au tableau.
     * 
     * @param PieceSquadro $piece La pièce à ajouter.
     * @return void
     */
    public function add(PieceSquadro $piece): void {
        $this->pieces[] = $piece;
    }

    /**
     * Supprime une pièce du tableau par son index.
     * 
     * @param int $index L'index de la pièce à supprimer.
     * @return void
     */
    public function remove(int $index): void {
        if (isset($this->pieces[$index])) {
            unset($this->pieces[$index]);
            $this->pieces = array_values($this->pieces); // Réindexer le tableau
        }
    }

    /**
     * Convertit le tableau de pièces en une chaîne de caractères.
     * 
     * @return string Une chaîne représentant toutes les pièces.
     */
    public function __toString(): string {
        $output = "";
        foreach ($this->pieces as $piece) {
            $output .= $piece->__toString() . "\n";
        }
        return $output;
    }

    /**
     * Convertit la collection de pièces en JSON.
     * 
     * @return string Une chaîne JSON représentant les pièces.
     */
    public function toJson(): string {
        return json_encode(array_map(fn($piece) => json_decode($piece->toJson(), true), $this->pieces));
    }

    /**
     * Crée une instance de ArrayPieceSquadro depuis une chaîne JSON.
     * 
     * @param string $json Une chaîne JSON représentant un tableau de pièces.
     * @return ArrayPieceSquadro Une instance créée à partir du JSON.
     */
    public static function fromJson(string $json): ArrayPieceSquadro {
        $data = json_decode($json, true);
        $arrayPieceSquadro = new self();
        foreach ($data as $pieceData) {
            $arrayPieceSquadro->add(PieceSquadro::fromJson(json_encode($pieceData)));
        }
        return $arrayPieceSquadro;
    }

    // Implémentation de ArrayAccess

    /**
     * Vérifie si une pièce existe à l'index donné.
     * 
     * @param mixed $offset L'index à vérifier.
     * @return bool True si la pièce existe, sinon false.
     */
    public function offsetExists($offset): bool {
        return isset($this->pieces[$offset]);
    }

    /**
     * Récupère une pièce par son index.
     * 
     * @param mixed $offset L'index de la pièce.
     * @return PieceSquadro|null La pièce correspondante ou null si l'index n'existe pas.
     */
    public function offsetGet($offset): ?PieceSquadro {
        return $this->pieces[$offset] ?? null;
    }

    /**
     * Définit une pièce à un index donné.
     * 
     * Si l'index est null, la pièce est ajoutée à la fin du tableau.
     * 
     * @param mixed $offset L'index où ajouter/modifier la pièce.
     * @param mixed $value La pièce à ajouter (doit être une instance de PieceSquadro).
     * @return void
     * 
     * @throws InvalidArgumentException Si la valeur n'est pas une instance de PieceSquadro.
     */
    public function offsetSet($offset, $value): void {
        if ($value instanceof PieceSquadro) {
            if (is_null($offset)) {
                $this->pieces[] = $value;
            } else {
                $this->pieces[$offset] = $value;
            }
        } else {
            throw new InvalidArgumentException("Value doit être une instance de PieceSquadro");
    /**
     * Supprime une pièce par son index.
     * 
     * @param mixed $offset L'index de la pièce à supprimer.
     * @return void
     */
    public function offsetUnset($offset): void {
        if (isset($this->pieces[$offset])) {
            unset($this->pieces[$offset]);
        }
    }

    // Implémentation de Countable

    /**
     * Retourne le nombre de pièces dans le tableau.
     * 
     * @return int Le nombre total de pièces.
     */
    public function count(): int {
        return count($this->pieces);
    }
}

?>