2011-01-03 5 views
1

今日は、以前はうまく機能していたオブジェクトモデルで奇妙な動作が発生したことに気付きました。 PHPのバージョンに変更して他の誰かが似たような経験をしているのか疑問に思う)配列であるオブジェクトプロパティのキーを設定する

最近まで、私は手動で配列だったオブジェクトプロパティのキーを設定することができました。私のモデルの1つの具体的な実装は、次のようなギャラリークラスに含まれていました:

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

無関係な部分は省略されています。

基本的には、ギャラリーのPhotosオブジェクトの配列キーをデータベース内の個々の写真のIDに設定できます。これにより、個々の繰り返しを記述するのが簡単になり、全体がより円滑に実行されました。

私はそのキーを何に設定しても、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 
       ) 

     ) 

は手動配列は、いくつかのマイナーリリースで削除されているオブジェクトのプロパティ内のキーを設定するabillityを持っており、私はそれに気づいていないのですか?私は、すべての上で検索し、PHPのマニュアルサイトを見て、答えが見つかりませんでした。誰も似たような経験はありますか?私は考慮すべきより良いアプローチがありますか?私は本当に次の/前のシステムを次の/前のシステムを次の論理IDに戻して実装するのがずっと簡単だったからです(IDは間で削除できるということを心に留めてください)。

ありがとう!

+2

このような制限は導入されていません。私は前にこのようなことを見てきました。そして、それは常にコールスタックのどこかではあいまいなものになります。もう少しコードを投稿できますか? –

答えて

0

あなたの持つものに間違いはありません。自分が説明した動作を経験したことはありません。しかし、迅速な解決策は、このようなもので割り当てラインを交換することができます:あなたはまた、echo $gp->GalleryPhotoID;GalleryPhotoIDプロパティは、実際にそのようにアクセスできることを確実にするために可能性が

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

$output['foobar'] = $gp; 

、それはまだ、各エントリの整数キーを使用して新しいエントリを作成:

最後に、あなたが何かに似で上記の行を置き換え言いましたか?そうだとしたら、コードの中にあなたが省略した何かが問題を引き起こしているかもしれないと思う。

0

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

    } 

あなたの注意書きが私の誤りにつながったので、回答とコメントの両方を受け入れてアップしました。みんなありがとう!

関連する問題