Pregunta

Hoy mismo he notado un comportamiento extraño en un modelo de objetos que antes estaba trabajando muy bien (He comprobado todo lo posible y nada acerca de su configuración ha cambiado, por lo que estoy sospechando un cambio a la versión de PHP y se preguntaba si alguien tiene experiencia algo similar)

Hasta hace poco, podría establecer las claves de propiedades de los objetos que estaban matrices manualmente. El implememation específica de esto en uno de mis modelos estaba contenida en una clase de galería que se veía así:

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

partes irrelevantes omitidas.

Básicamente, pude establecer las claves de matriz de fotos de la galería de objetos de Identificación de la foto individual en la base de datos. Esto sólo hace que sea más fácil para la iteración código individual y hizo que todo el más suave cosa plazo.

Ahora, no importa lo que se propuso que la clave para, enteros automáticas se generan cuando se ejecuta la foreach. Incluso he intentado escribir una cadena literal de allí, lo que teóricamente deberían reemplazar cada iteración, pero aún así nos incrementa, enteros automáticas para las llaves de la propiedad Fotos.

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

        )

Tiene la abillity de teclas configuradas manualmente dentro de una propiedad de objeto que se ha eliminado una serie de alguna versión menor y soy consciente de ello? He buscado en Google en todo, visto a través del sitio manual de PHP y no encontró ninguna respuesta. Alguien ha experimentado algo similar? ¿Hay un mejor enfoque que debería considerar? Lo único que realmente fui con esto porque hizo mucho más fácil de implementar un sistema anterior / siguiente a través de Ajax peticiones a la próxima ID lógico (teniendo en cuenta que los identificadores se pueden eliminar entre!)

Gracias!

¿Fue útil?

Solución

No veo nada malo con lo que tienes, y nunca he experimentado el comportamiento que usted describe. Sin embargo, una rápida solución podría consistir en sustituir la línea de asignación con algo como esto:

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

También podría echo $gp->GalleryPhotoID; para asegurar que la propiedad se puede acceder GalleryPhotoID realidad de esa manera.

Por último, usted ha dicho se ha sustituido la línea anterior con algo parecido a:

$output['foobar'] = $gp;

y todavía crea una nueva entrada, con las teclas de números enteros, para cada entrada? Si ese es el caso, entonces yo creo que puede haber algo en el código que omite que está causando el problema.

Otros consejos

Facepalm todo el camino. El efluvio de mosto de Año Nuevo todavía en mi cerebro, de lo contrario me habría dado cuenta de que la función añadí a buscar la miniatura de la portada del álbum barajó la matriz si no había una foto con el conjunto de propiedades albumCover!

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 modificado que esto acaba de hacer una copia local de la variable aleatoria y que en lugar si se ha establecido ninguna cubierta.

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

    }

Me aceptó y upvoted tanto la respuesta y el comentario publicado ya sus advertencias me llevan a mi error. Gracias chicos!

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top