Установка ключа свойства объекта, являющегося массивом

StackOverflow https://stackoverflow.com/questions/4589094

  •  14-10-2019
  •  | 
  •  

Вопрос

Буквально сегодня я заметил странное поведение в объектной модели, которая раньше работала нормально (я проверил все возможное, и ничего в ее конфигурации не изменилось, поэтому я подозреваю изменение версии 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-запросов обратно к следующему логическому идентификатору (имея в виду, что идентификаторы можно удалять между собой!)

Спасибо!

Это было полезно?

Решение

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

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

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

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

$output['foobar'] = $gp;

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

Другие советы

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

    }

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top