Установка ключа свойства объекта, который является массивом - PullRequest
1 голос
/ 04 января 2011

Только сегодня я заметил странное поведение в объектной модели, которая ранее работала просто отлично (я проверил все возможное, и ничего в его конфигурации не изменилось, поэтому я подозреваю, что изменилась версия PHP, и хотел бы знать, есть ли у кого-то еще опыт ничего похожего)

До недавнего времени я мог задавать ключи свойств объектов, которые были массивами, вручную. Конкретная реализация этого в одной из моих моделей содержалась в классе галереи, который выглядел так:

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

Несущественные части опущены.

В принципе, я мог бы установить ключи массива объекта Фото Галереи для идентификатора отдельной фотографии в базе данных. Это только облегчило кодирование для отдельной итерации и сделало все это более плавным.

Теперь, независимо от того, на что я установил этот ключ, автоматические целые числа генерируются при запуске foreach. Я даже попытался набрать там буквальную строку, которая теоретически должна заменять каждую итерацию, но я все еще получил увеличенные автоматические целые числа для ключей свойства 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
                )

        )

Была ли удалена способность вручную устанавливать ключи в свойстве объекта, являющегося массивом, в какой-то второстепенной версии, и я не знаю об этом? Я погуглил по всему, просмотрел руководство по PHP и не нашел ответа. Кто-нибудь испытывал что-нибудь подобное? Есть ли лучший подход, который я должен рассмотреть? Я действительно пошел с этим, потому что это сделало намного проще реализовать следующую / предыдущую систему через запросы ajax к следующему логическому идентификатору (помня, что идентификаторы могут быть удалены между!)

Спасибо!

Ответы [ 2 ]

0 голосов
/ 04 января 2011

Facepalm полностью.Слив Нового Года все еще должен быть в моем мозгу, иначе я бы заметил, что функция, которую я добавил для извлечения эскиза обложки альбома, перетасовывает массив, если не было фотографии с установленным свойством 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);

    }

Я изменил это, чтобы просто сделать локальную копию переменной и перемешать ее, если вместо нее не установлена ​​обложка.

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

    }

Я принял и проголосовал как за ответ, так и за комментарийопубликовал, так как ваши предостережения приводят меня к моей ошибке.Спасибо, ребята!

0 голосов
/ 04 января 2011

Я не вижу ничего плохого в том, что у вас есть, и я никогда не испытывал поведение, которое вы описываете. Однако, быстрое решение может состоять в том, чтобы заменить строку назначения чем-то вроде этого:

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

Вы также можете echo $gp->GalleryPhotoID; убедиться, что свойство GalleryPhotoID действительно доступно таким образом.

Наконец, вы сказали, что заменили вышеприведенную строку чем-то похожим на:

$output['foobar'] = $gp;

и он по-прежнему создает новую запись с целочисленными ключами для каждой записи? Если это так, то я думаю, что в коде, который вы пропустили, может быть что-то, вызывающее проблему.

...