Frage

Erst heute bemerkte ich ein seltsames Verhalten in einem Objektmodell, das zuvor gut funktioniert hat (ich habe alles Mögliche überprüft und nichts an seiner Konfiguration hat sich geändert, daher vermutete ich eine Änderung der PHP -Version und frage mich, ob jemand anderes etwas Ähnliches hat).

Bis vor kurzem konnte ich die Schlüssel der Objekteigenschaften, die manuell waren, einstellen. Die spezifische Implementierung davon in einem meiner Modelle war in einer Galerieklasse enthalten, die so aussah:

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

Irrelevante Teile weggelassen.

Grundsätzlich konnte ich die Array -Schlüssel des Fotos der Galerie auf die ID des Einzelfotos in der Datenbank einstellen. Dies machte es nur einfacher, für die individuelle Iteration zu codieren, und machte das Ganze glatter.

Unabhängig davon, wofür ich diesen Schlüssel festgelegt habe, werden automatische Ganzzahlen generiert, wenn der Foreach ausgeführt wird. Ich habe sogar versucht, dort eine buchstäbliche Schnur zu tippen, die theoretisch jede Iteration ersetzen sollte, aber ich wurde immer noch inkrementiert, automatische Ganzzahlen für die Schlüssel der Grundstücksfotos.

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

        )

Wurde die Verschwendung, Schlüssel in einer Objekteigenschaft manuell einzustellen, in einer geringen Veröffentlichung manuell eingestellt worden, und ich bin mir dessen nicht bewusst? Ich habe überall gegoogelt, habe die PHP -Handbuch -Site durchgesehen und keine Antwort gefunden. Hat jemand etwas Ähnliches erlebt? Gibt es einen besseren Ansatz, den ich berücksichtigen sollte? Ich habe nur wirklich damit gegangen, weil es es so viel einfacher gemacht hat, ein nächstes/vorheriges System über AJAX -Anfragen auf die nächste logische ID zu implementieren (denken Sie daran, dass IDs zwischen gelöscht werden können!)

Vielen Dank!

War es hilfreich?

Lösung

Ich sehe nichts falsch mit dem, was Sie haben, und ich habe das von Ihnen beschriebene Verhalten nie erlebt. Eine schnelle Lösung könnte jedoch darin bestehen, die Zuordnungslinie durch so etwas zu ersetzen:

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

Du könntest auch echo $gp->GalleryPhotoID; um sicherzustellen, dass die GalleryPhotoID Immobilien können tatsächlich auf diese Weise zugegriffen werden.

Zuletzt sagten Sie, Sie haben die obige Linie durch etwas ersetzt, das ähnlich ist:

$output['foobar'] = $gp;

Und es wurde immer noch einen neuen Eintrag mit Ganzzahlschlüssel für jeden Eintrag erstellt? Wenn dies der Fall ist, dann denke ich, dass der Code, den Sie weggelassen haben, das Problem verursacht.

Andere Tipps

Facepalm den ganzen Weg. Das Effluvium des Neujahrs muss noch in meinem Gehirn sein. Andernfalls hätte ich bemerkt, dass die Funktion, die ich hinzugefügt habe, um das Album Cover zu holen, das Array aus dem Vordergrund mischte, wenn es kein Foto mit dem AlbumCover -Eigenschafts -Set gab!

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

    }

Ich habe dies geändert, um nur eine lokale Kopie der Variablen zu erstellen und das zu mischen, wenn kein Cover festgelegt ist.

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

    }

Ich habe sowohl die Antwort als auch den Kommentar angenommen und aufgenommen, da Ihre Vorbehalte mich zu meinem Fehler geführt haben. Danke Leute!

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top