Domanda

Proprio oggi ho notato un comportamento strano in un modello di oggetto che è stato in precedenza lavorando bene (ho controllato tutto il possibile e nulla circa la sua configurazione è cambiata, così sto ritenendo sospetto una modifica alla versione di PHP e si chiede se qualcun altro ha esperienza qualcosa di simile)

Fino a poco tempo, ho potuto impostare le chiavi di proprietà dell'oggetto che erano array manualmente. L'implememation specifica di questo in uno dei miei modelli era contenuta in una classe galleria che si presentava così:

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

parti irrilevanti omesse.

In sostanza, ho potuto impostare le chiavi dell'array di foto della Galleria oggetto di id della singola foto nel database. Questo solo ha reso più facile il codice per l'iterazione individuale e ha reso il tutto più agevole cosa run.

Ora, non importa quello che ho impostato la chiave per, interi automatici vengono generati quando viene eseguito il foreach. Ho anche provato a digitare una stringa letterale in là, che teoricamente dovrebbe sostituire ogni iterazione, ma ho ancora incrementato, interi automatiche per le chiavi delle proprietà foto.

[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
                )

        )

Ha l'abillity ai tasti impostati manualmente all'interno di una proprietà oggetto che è un array stato rimosso in qualche release minore e sono a conoscenza di esso? Googled tutto, guardato attraverso il sito manuale di PHP e non ha trovato risposta. Qualcuno ha provato nulla di simile? C'è un approccio migliore devo considerare? Ho solo davvero andato con questo, perché ha reso molto più facile per implementare un sistema di prossima / precedente tramite Ajax richieste di nuovo alla prossima id logica (tenendo presente che gli ID possono essere eliminati tra!)

Grazie!

È stato utile?

Soluzione

non vedo nulla di sbagliato in quello che hai, e non ho mai sperimentato il comportamento che descrivi. Tuttavia, una soluzione rapida potrebbe essere quella di sostituire la linea di assegnazione con qualcosa di simile:

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

Si potrebbe anche echo $gp->GalleryPhotoID; per assicurare che la proprietà GalleryPhotoID può effettivamente essere letta in questo modo.

Infine, hai detto che è stata sostituita la linea di cui sopra con qualcosa di simile a:

$output['foobar'] = $gp;

ed è comunque creato una nuova voce, con chiavi intere, per ogni voce? Se questo è il caso, allora penso che ci possa essere qualcosa nel codice si omesso che sta causando il problema.

Altri suggerimenti

Facepalm tutta la strada. L'effluvio di mosto di Capodanno essere ancora nel mio cervello, altrimenti me ne sarei accorto che la funzione ho aggiunto per andare a prendere la miniatura copertina dell'album mischiato la matrice se non ci fosse una foto con l'insieme di proprietà copertina di un album!

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);

    }

I modificato questo per fare solo una copia locale della variabile e shuffle che, invece, se nessuna copertura è impostato.

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

    }

ho accettato e upvoted sia la risposta e il commento postato dal tuoi avvertimenti mi portano a mio errore. Grazie ragazzi!

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top