Question

Aujourd'hui même j'ai remarqué un comportement étrange dans un modèle d'objet qui travaillait auparavant très bien (j'ai vérifié tout possible et rien sa configuration a changé, donc je soupçonnais un changement à la version PHP et je me demandais si quelqu'un d'autre expérience quelque chose de semblable)

Jusqu'à récemment, je pouvais définir les clés de propriétés d'objet qui étaient des tableaux manuellement. Le implememation spécifique de ce dans l'un de mes modèles était contenu dans une classe de galerie qui ressemblait à ceci:

public function __construct($gid){
        parent::__construct($gid);
        $this->Photos = $this->getPhotos();
        $this->AlbumCover = $this->getCover();
    }

    public function getPhotos(){
        $sql = 'SELECT GalleryPhotoID FROM GalleryPhoto WHERE GalleryID = ?';
        $params = array($this->GalleryID);
        $allids = DatabaseHandler::GetAll($sql, $params);
        $output = array();
        foreach($allids as $id){
            $gp = new GalleryPhoto($id['GalleryPhotoID']);
            $output[$gp->GalleryPhotoID] = $gp;
        }
        return $output;
    }

parties non pertinentes omis.

En fait, je pourrais définir les clés du tableau de Photos de la Galerie objet à l'ID de photo individuelle dans la base de données. Ce juste il est plus facile à coder pour l'itération individuelle et a fait le plus lisse toute la course chose.

Maintenant, peu importe ce que je mets cette clé pour, entiers automatiques sont générés lors de l'exécution foreach. J'ai même essayé de taper une chaîne littérale là-dedans, ce qui devrait théoriquement remplacer chaque itération, mais je suis toujours incrémentée, entiers automatiques pour les clés de la propriété Photos.

[Photos] => Array
        (
            [0] => GalleryPhoto Object
                (
                    [GalleryID] => 9
                    [Caption] => 
                    [Orientation] => 0
                    [AlbumCover] => 
                    [DateAdded] => 2011-01-03 16:58:51
                    [GalleryPhotoID] => 63
                    [Thumbnail] => 
                    [Image] => 
                    [src] => http://..com/galleryImage/getImage/63
                )

            [1] => GalleryPhoto Object
                (
                    [GalleryID] => 9
                    [Caption] => 
                    [Orientation] => 0
                    [AlbumCover] => 
                    [DateAdded] => 2011-01-03 16:58:51
                    [GalleryPhotoID] => 64
                    [Thumbnail] => 
                    [Image] => 
                    [src] => http://..com/galleryImage/getImage/64
                )

        )

A la abillity aux clés définies manuellement dans une propriété d'objet qui est un tableau été supprimé dans une version mineure et je ne connais pas ce? J'ai googlé partout, regardé à travers le site manuel PHP et n'a trouvé aucune réponse. Est-ce que quoi que ce soit connu quelqu'un de semblable? Y at-il une meilleure approche que je devrais considérer? Je ne suis allé vraiment avec cela parce qu'il a rendu beaucoup plus facile à mettre en œuvre un système suivant / précédent via ajax demande à la prochaine id logique (en gardant à l'esprit que ids peuvent être supprimés entre!)

Merci!

Était-ce utile?

La solution

Je ne vois rien de mal à ce que vous avez, et je ne l'ai jamais connu le comportement que vous décrivez. Cependant, une solution rapide pourrait être de remplacer la ligne d'affectation avec quelque chose comme ceci:

$output[$id['GalleryPhotoID']] = $gp;

Vous pouvez également echo $gp->GalleryPhotoID; pour garantir que la propriété GalleryPhotoID peut effectivement être accessible de cette façon.

Enfin, vous avez dit que vous avez remplacé la ligne ci-dessus avec quelque chose qui ressemble à:

$output['foobar'] = $gp;

et encore créé une nouvelle entrée, avec des touches entières, pour chaque entrée? Si tel est le cas, alors je pense qu'il peut y avoir quelque chose dans le code d'omission de la cause du problème.

Autres conseils

Facepalm tout le chemin. L'effluve du Nouvel An doit encore être dans mon cerveau, sinon je l'aurais remarqué que la fonction que j'ajouté pour aller chercher la vignette de la couverture de l'album brassé le tableau s'il n'y avait pas une photo avec l'ensemble de la propriété pochette!

private function getCover(){
        foreach($this->Photos as $ind=>$p){
            if($p->AlbumCover){
                return $this->Photos[$ind];
            }
        }

        shuffle($this->Photos); //this is the problem
        return current($this->Photos);

    }

Je modifié ce simplement faire une copie locale de la variable et aléatoire qu'au lieu si aucune couverture est réglée.

private function getCover(){
        foreach($this->Photos as $ind=>$p){
            if($p->AlbumCover){
                return $this->Photos[$ind];
            }
        }
        $Photos = $this->Photos;
        shuffle($Photos);
        return current($Photos);

    }

J'ai accepté et upvoted fois la réponse et le commentaire posté depuis vos mises en garde me conduire à mon erreur. merci les gars!

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top