[RESOLU] Envoyer mon array objet dans un autre array objet.

MI7
Eléphanteau du PHP | 11 Messages

15 févr. 2020, 01:31

Bonjours a vous je suis confus, j'ai une Classe Livre qui contient le titre,auteur,année et j'ai une Classe Bibliothèque = array

donc dans ma page principale j'ai un tableaux associatif qui se nomme $listeLivres qui contient tous les informations des livres.

mon but premier est de créer un objet(array) de la Class Livre. ensuite je fais un Foreach pour vérifier si il y a des erreurs.

tout ça va très bien, la ou cella coince c'est que je dois envoyer les oLivres dans l'objet oBibliothèque qui est de la classe Bibliothèque.

voici un exemple de ce que j'aimerais sa soit.

Code : Tout sélectionner

Array ( [0] => Bibliotheque Object ( [bibliotheque:Bibliotheque:private] => Array ( [1] => Livre Object ( [annee:Livre:private] => 2009 [auteur:Livre:private] => Marie Ndiaye [titre:Livre:private] => Trois Femmes Puissantes [erreurs:Livre:private] => Array ) [4] => Livre Object ( [annee:Livre:private] => 2010 [auteur:Livre:private] => Michel Houellebecq [titre:Livre:private] => La Carte Et Le Territoire [erreurs:Livre:private] => Array ( ) ) )


Je suis pas loin de trouver la solution mais beaucoup de difficulté c'est ma troisième journée avec le POO.
Voici mon code de ma page principale.

Code : Tout sélectionner

<?php // Suggestion : // 1- Créer un objet bibliothèque // 2- Balayer ce tableau de livres et pour chaque occurrence // - créer un objet Livre // - s'il n'a aucune erreur l'ajouter à la bibliothèque // - sinon le détruire // 3- Exécuter le getter de la propriété livres de l'objet bibliothèque // 4- Exécuter les méthodes de recherche sur l'objet bibliothèque // 5- Supprimer des livres de la bibliothèque // 6- Exécuter le getter de la propriété livres de l'objet bibliothèque require_once 'classes/Livre.php'; // Chargement de la classe Livre require_once 'classes/Bibliotheque.php'; // Chargement de la classe Bibliotheque $listeLivres = array( array( "annee" => 2009, "auteur" => "Marie NDiaye", "titre" => "Trois femmes puissantes" ), array( "annee" => 2010, "auteur" => "Michel Houellebecq", "titre" => "La Carte et le Territoire" ), // doublon du précédent array( "annee" => 2010, "auteur" => "Michel Houellebecq", "titre" => "La Carte et le Territoire" ), // année incorrecte array( "annee" => 'aaaa', "auteur" => "Michel Houellebecq", "titre" => "La Carte et le Territoire" ), array( "annee" => 2011, "auteur" => "Alexis Jenni", "titre" => "L'Art français de la guerre" ), array( "annee" => 2012, "auteur" => "Jérôme Ferrari", "titre" => "Le Sermon sur la chute de Rome" ), array( "annee" => 2013, "auteur" => "Pierre Lemaitre", "titre" => "Au revoir là-haut" ), array( "annee" => 2014, "auteur" => "Lydie Salvayre", "titre" => "Pas pleurer" ), array( "annee" => 2015, "auteur" => "Mathias Énard", "titre" => "Boussole" ), array( "annee" => 2016, "auteur" => "Leïla Slimani", "titre" => "Chanson douce" ), array( "annee" => 2016, "auteur" => "Gaël Faye", "titre" => "Petit pays" ), array( "annee" => 2017, "auteur" => "Éric Vuillard", "titre" => "L'Ordre du jour" ), array( "annee" => 2018, "auteur" => "Nicolas Mathieu", "titre" => "Leurs enfants après eux" ), array( "annee" => 2019, "auteur" => "Jean-Paul Dubois", "titre" => "Tous les hommes n'habitent pas le monde de la même façon" ) ); $oBibliotheques = []; $oLivres = []; $i = 0; // indice de remplissage du tableau $oLivres d'objets de la classe Livre $j = 0; // indice de balayage du tableau $listeLivres foreach ($listeLivres as $livre) { $oLivres[$i] = new Livre($livre['annee'], $livre['auteur'], $livre['titre']); $oBibliotheques[] = new Bibliotheque(['bibliotheque']); echo "Traitement du livre d'indice " . $j . " du tableau listeLivres<br>"; // pour tester les erreurs avec la méthode getErreurs() if (count($oLivres[$i]->getErreurs($livre['annee'], $livre['auteur'], $livre['titre'])) !== 0) { echo "<br>Comporte des erreurs <pre>" . print_r($oLivres[$i], true) . "</pre>"; unset($oLivres[$i]); // destruction explicite de l'objet } else { $oBibliotheques[] = array_push($oBibliotheques, $oLivres[$i]); $oLivres[$i]->afficherLivre(); $i++; } $j++; } echo "<br> test test test test <pre>" . print_r($oBibliotheques, true) . "</pre>"; echo "<br> Objets livre du tableau oLivres (sans erreurs) <pre>" . print_r($oLivres, true) . "</pre>";

Ma classe livre

Code : Tout sélectionner

<?php /** * Classe de l'entité Personne * */ class Livre { private $annee; // 'AAAA' private $auteur; private $titre; private $erreurs = array(); /** * Constructeur de la classe * */ public function __construct($annee = null, $auteur = null, $titre = null) { $this->setAnnee($annee); $this->setAuteur($auteur); $this->setTitre($titre); } /** * Destructeur de la classe * */ public function __destruct() { echo "Le livre $this->titre $this->auteur n'existe plus!<br><br>"; } /** * Accesseur de la propriété Auteur * * @return string */ public function getAuteur() { return $this->auteur; } /** * Accesseur de la propriété titre * * @return string */ public function getTitre() { return $this->titre; } /** * Accesseur de la propriété Annee * * @return formatted date 'AAAA' */ public function getAnnee() { return $this->annee; } /** * Accesseur de la propriété erreurs * * @return array */ public function getErreurs() { return $this->erreurs; } /** * Mutateur de la propriété Auteur * * @return boolean */ public function setAuteur($auteur = null) { unset($this->erreurs['auteur']); $auteur = trim($auteur); $regExp = '/^[a-zàâçéèêëîïôûùüÿñæœÉ .-]*$/i'; // contrôle au moins 2 caractères alphabétiques if ($auteur !== null && preg_match($regExp, $auteur)) { $this->auteur = ucwords(strtolower($auteur)); } else { $this->erreurs['auteur'] = true; } return $this; } /** * Mutateur de la propriété titre * * @return boolean */ public function setTitre($titre = null) { unset($this->erreurs['titre']); $titre = trim($titre); $regExp = '/^[a-zàâçéèêëîïôûùüÿñæœ \'.-]*$/i'; // contrôle au moins 2 caractères alphabétiques if ($titre !== null && preg_match($regExp, $titre)) { $this->titre = ucwords(strtolower($titre)); } else { $this->erreurs['titre'] = true; } return $this; } /** * Mutateur de la propriété annee * * @return boolean */ public function setAnnee($annee = null) { unset($this->erreurs['annee']); $annee = trim($annee); if ($annee !== null && preg_match('/^\d{4}$/', $annee)) { $this->annee = $annee; } else { $this->erreurs['annee'] = true; } return $this; } /** * Affichage direct des propriétés de la livre * */ public function afficherLivre() { if (isset($this->auteur) && isset($this->titre) && isset($this->annee)) { echo "Le livre $this->titre $this->auteur est née le $this->annee.<br><br>"; } else { echo "Ce livre n'a pas toutes ses propriétés.<br>"; } } }
ma classe bibliotheque

Code : Tout sélectionner

<?php // require_once 'classes/Livre.php'; // Chargement de la classe Livre /** * Classe de l'entité Personne * */ class Bibliotheque { private $bibliotheque = array(); /** * Accesseur de la propriété livres * * @return string */ public function getLivres() { return $this->bibliotheque; } // /** // * Destructeur de la classe // * SupprimerLivre // */ // public function __destruct() // { // echo "Le livre $this->titre $this->auteur n'existe plus!<br><br>"; // } /** * function ajouter livre dans un tableau * */ public function ajouterLivre($oLivre) { array_push($bibliotheque, $oLivre); } /** * function rechercher annee de publication * */ public function rechercherAnne($trouveAnne) { if (isset($this->auteur) && isset($this->titre) && isset($this->annee)) { echo "Le livre $this->titre $this->auteur est née le $this->annee.<br><br>"; } else { echo "Ce livre n'a pas toutes ses propriétés.<br>"; } } /** * function rechercher titre de publication * */ public function rechercherTitre($trouveTitre) { if (isset($this->auteur) && isset($this->titre) && isset($this->annee)) { echo "Le livre $this->titre $this->auteur est née le $this->annee.<br><br>"; } else { echo "Ce livre n'a pas toutes ses propriétés.<br>"; } } }

Mammouth du PHP | 682 Messages

15 févr. 2020, 09:30

foreach ($listeLivres as $livre) {
$oLivres[$i] = new Livre($livre['annee'], $livre['auteur'], $livre['titre']);
$oBibliotheques[] = new Bibliotheque(['bibliotheque']);

une bibliotheque, il n'y a en a qu'une seule, donc l'objet bibliotheque ne doit pas être créé dans la boucle de parcours des livres.

la fonction ajouterLivre de la classe Bibliotheque n'est jamais appelée...

le code devrait être :
$bibliotheque = new Bibliotheque();
$bibliotheque->populate($listeLivres);
$bibliotheque->afficherContenu();
...

MI7
Eléphanteau du PHP | 11 Messages

19 févr. 2020, 21:53

Merci j'ai finalement simplifier mon code. j'ai réussis a faire comme tu m'as écrit. =D>

Maintenant que mes livres sont bien dans mon Objet oBibliotheque,
j'ai une fonction qui porte le nom rechercherAnnee et j'arrive pas aller chercher les informations "annee","auteur"...
dans ma fonction je veux balayer tous les livre et voir si l'année entré par l'utilisateur est égale a une année d'un ou plusieur livre.




Dans ma page principale la fonction rechercherAnnee j'ai mis dans les paramètres $oBibliotheque est-ce que c'Est vraiment nécessaire ou completement obsolescente? parce que une fois rendu dans la fonction on peut utilisé $this au lieu de $oBibliotheque ?


Code : Tout sélectionner

//Ajout du tableau listeLivre dans l'objet $oBibliotheque $oBibliotheque = new Bibliotheque; $oBibliotheque->ajouterLivre($listeLivres); //recherche l'annee d'un livre. $trouverAnnee = 2016; $oBibliotheque->rechercherAnnee($trouverAnnee, $oBibliotheque);

Page : Bibliotheque.php

Code : Tout sélectionner

<?php /** * Classe de l'entité Personne * */ class Bibliotheque { private $livres = array(); /** * Accesseur de la propriété livres * * @return string */ public function getlivres() { return $this->livres; } /** * function ajouter livre dans un tableau * */ public function ajouterLivre($oLivres) { $i = 0; foreach ($oLivres as $livre) : $this->livres[$i] = new Livre($livre['annee'], $livre['auteur'], $livre['titre']); $i++; endforeach; } /** * function rechercher annee de publication * */ public function rechercherAnnee($trouverAnnee, $oBibliotheque) { foreach ($oBibliotheque as $oLivres) if ($trouverAnnee == $oLivres['annee']) { echo "L'annee $oLivres->annee du titre $oLivres->titre est dans notre bibliotheque.<br><br>"; } else { echo var_dump($oLivres) . "aucun livre corespon a cette annee.<br>"; } } }

Avatar du membre
Mammouth du PHP | 1131 Messages

20 févr. 2020, 11:17

Salut, non tu n'as pas besoin de passer l'instance de bibliothèque à elle même, tu peux en effet utiliser le $this.
Tu devrais boucler sur $this->livres et tes livres étant des objets Livre il faudrait utiliser $livre->getAnnee() pour récupérer l'année.

PS : et dans la logique, me concernant, la méthode de recherche devrait retourner un tableau de livres correspondant à l'année recherchée plutôt que de faire des echo directement dans la méthode. Tu peux ensuite faire un count sur ce tableau pour savoir si il contient ou non des livres et boucler dessus pour afficher les infos que tu veux afficher.
J'édite souvent mon message après avoir répondu pour le corriger où y apporter des informations complémentaires alors n'hésitez pas à y jeter un nouveau coup d'oeil ^^

MI7
Eléphanteau du PHP | 11 Messages

21 févr. 2020, 02:28

Merci de l'information j'ai compris aujourd'hui que si on n'a pas de getteur magique on doit passer par les accesseurs getTitre pour manipuler la propriété Titre et je comprend mieux le $this c'est beaucoup plus claire. sa avance a petit pas.

j'ai fais quel que avancé j'ai réussis a faire ce que je voulais lors de ma question ainsi j'ai ajouté une recherche par titre et une suppression d'un livre, ceci n'est pas encore parfait mais reste que c'est un début.

Voila comme tu disais retourner un tableau c'est beaucoup plus logique.

j'ai commencé a déclaré ma variable $i = 0 et $lesAnneesTrouvee = array
présentement je fais déjà un foreach pour vérifier si l'année correspond a valeur entré par l'utilisateur.
ensuite si je comprend bien dans mon If faudrait j'insert les bonnes valeurs dans mon tableaux $lesAnneesTrouvee?
c'est un peu flou dans ma tete. je vais aller dodo et demain je vais regardé tete reposé.

Code : Tout sélectionner

*/ public function rechercherAnneePublication($trouverAnnee) { $i = 0; $lesAnneesTrouvee = array(); foreach ($this->livres as $oLivres) : if ($trouverAnnee == $oLivres->getAnnee()) { echo "L'annee " . $oLivres->getAnnee() . "<br> du titre " . $oLivres->getTitre() . " est dans notre bibliotheque.<br><br>"; } else { echo "aucun livre corespond a cette annee.<br>"; } endforeach; }



Page principal.

Code : Tout sélectionner

//Ajout du tableau listeLivre dans l'objet $oBibliotheque $oBibliotheque = new Bibliotheque; $oBibliotheque->ajouterLivre($listeLivres); //recherche l'annee d'un livre. $trouverAnnee = 2016; $oBibliotheque->rechercherAnneePublication($trouverAnnee); //recherche titre d'un livre. $trouverTitre = strtolower("Tous les hommes n'habitent pas le monde de la même façon"); $oBibliotheque->rechercherTitreContient($trouverTitre); //Supression d'un livre. $suppressionLivre = strtolower("Tous les hommes n'habitent pas le monde de la même façon"); $oBibliotheque->suppressionLivre($suppressionLivre);

Page Class Bibliothque

Code : Tout sélectionner

<?php /** * Classe de l'entité Personne * */ class Bibliotheque { private $livres = array(); /** * Accesseur de la propriété livres * * @return string */ public function getlivres() { return $this->livres; } /** * function recherche titre d'un livre * * */ public function rechercherTitreContient($trouverTitre) { $i = 0; $lestitresTrouvee = array(); foreach ($this->livres as $oLivres) : if ($trouverTitre == $oLivres->getTitre()) { echo "Le titre " . $oLivres->getTitre() . "<br> de l'auteur " . $oLivres->getAuteur() . " est dans notre bibliotheque.<br><br>"; } else { echo "aucun livre ne corespon a ce titre.<br>"; } endforeach; } /** * function rechercher annee de publication * * */ public function rechercherAnneePublication($trouverAnnee) { $i = 0; $lesAnneesTrouvee = array(); foreach ($this->livres as $oLivres) : if ($trouverAnnee == $oLivres->getAnnee()) { echo "L'annee " . $oLivres->getAnnee() . "<br> du titre " . $oLivres->getTitre() . " est dans notre bibliotheque.<br><br>"; } else { echo "aucun livre corespond a cette annee.<br>"; } endforeach; } /** * function suppression d'un livre dans un tableau * * */ public function suppressionLivre($suppressionLivre) { $i = 0; foreach ($this->livres as $oLivres) : if ($suppressionLivre == $oLivres->getTitre()) { unset($this->livres[$i]); // destruction explicite de l'objet } else { echo " aucun livre corespond au information entré <br>"; $i++; } endforeach; } /** * function ajouter livre dans un tableau * * */ public function ajouterLivre($oLivres) { $i = 0; foreach ($oLivres as $livre) : $this->livres[$i] = new Livre($livre['annee'], $livre['auteur'], $livre['titre']); if (count($this->livres[$i]->getErreurs($livre['annee'], $livre['auteur'], $livre['titre'])) !== 0) { unset($this->livres[$i]); // destruction explicite de l'objet } else { $this->livres[$i] = new Livre($livre['annee'], $livre['auteur'], $livre['titre']); $i++; } endforeach; } }

Avatar du membre
Mammouth du PHP | 1131 Messages

21 févr. 2020, 11:15

Tout simplement :
    public function rechercherAnneePublication($annee)
    {
        $livres = [];// déclare un tableau vide

        foreach ($this->livres as $livre)
            if ($livre->getAnnee() == $annee)
                $livres[] = $livre;// ajoute $livre dans le tableau

        return $livres;
    }
Tu n'as pas besoin de gérer l'index du tableau pour le remplir.

Tu pourrais aussi utiliser la fonction array_filter :
    public function rechercherAnneePublication($annee)
    {
        return array_filter($this->livres, function ($livre) use ($annee) {
            return $livre->getAnnee() == $annee;
        });
    }
J'édite souvent mon message après avoir répondu pour le corriger où y apporter des informations complémentaires alors n'hésitez pas à y jeter un nouveau coup d'oeil ^^

MI7
Eléphanteau du PHP | 11 Messages

21 févr. 2020, 20:50

pour être sur de bien comprendre il n'est donc pas nécessaire de créer une variable d'incrémentation dans mon foreach?

ici j'aurais cru qu'il aurait été question d'insérer la variable $i dans [] pour ne de pas écraser l’indice 0 a chaque tour du foreach?

Code : Tout sélectionner

$livres[] = $livre; // ajoute $livre dans le tableau

j'ai testé cette version tout fois quand je retourne le tableau $livres est-ce normal qui a aucune information qui s'affiche a l’écran? j'ai simplement le retour du else de ma fonction qui affiche l’information du echo à l'écrans. :oops:

Code : Tout sélectionner

/** * function rechercher annee de publication * * */ public function rechercherAnneePublication($trouverAnnee) { $livres = []; // déclare un tableau vide foreach ($this->livres as $livre) : if ($trouverAnnee == $livre->getAnnee()) { $livres[] = $livre; // ajoute $livre dans le tableau qui correspond a l'annee rechercher. return $livres; } else { echo "aucun livre correspond a cette annee.<br>"; } endforeach; }

Avatar du membre
Mammouth du PHP | 1131 Messages

21 févr. 2020, 21:13

La syntaxe $livres[] = $livre; ajoute un nouvel index dans le tableau. Si tu voulais écraser l'index 0 tu devrais écrire $livres[0] = $livre;

Dans ma logique le traitement d'affichage devrait se faire suite au retour de la méthode. C'est pour ça que dans mes exemples précédents j'ai mis un return à la fin de rechercherAnneePublication().
//recherche l'annee d'un livre. 
$annee = 2016;
$livres = $oBibliotheque->rechercherAnneePublication($annee);

if (count($livres)) {
  echo "<p>Livres de l'année $annee :</p>";
  echo '<ul>';
  foreach ($livres as $livre)
    echo '<li>'.$livre->getTitre().'</li>';
  echo '</ul>';
}
else
  echo "Aucun livre ne correspond à l'année $annee.<br/>";

A toi de décider comment tu veux faire mais pour moi il faut découpler l'objet bibliothèque de l'affichage. La bibliothèque ne devrait pas avoir à se soucier de l'affichage. Elle est juste une façon de stocker de la données et de la récupérer.

Avec la direction que tu prends si tu veux utiliser la bibliothèque pour récupérer les livres d'une année donné disons pour envoyer les données au format json par exemple, tu devras ajouter une deuxième méthode qui fait la même boucle mais génère une sortie différente au lieu de simplement rappeler la même méthode et juste changer la sortie.
J'édite souvent mon message après avoir répondu pour le corriger où y apporter des informations complémentaires alors n'hésitez pas à y jeter un nouveau coup d'oeil ^^

MI7
Eléphanteau du PHP | 11 Messages

22 févr. 2020, 01:58

Merci beaucoup ton aide m'a beaucoup aider. les commentaires fut instructif :D