配列であるオブジェクトプロパティのキーを設定する
-
14-10-2019 - |
質問
ちょうど今日、私は以前にうまく機能していたオブジェクトモデルの奇妙な動作に気づきました(可能な限りすべてをチェックしていて、その構成について何も変更していないので、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;
}
無関係な部分は省略されています。
基本的に、ギャラリーの写真の配列キーをデータベース内の個々の写真のIDに設定することができました。これにより、個々の反復のコーディングが簡単になり、全体がよりスムーズに動作しました。
さて、私がその鍵を設定しても、Foreachが実行されたときに自動整数が生成されます。そこに文字通りの文字列を入力してみましたが、理論的にはすべての反復を置き換える必要がありますが、プロパティ写真のキーの自動整数が増えました。
[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要求を介して次の/以前のシステムを次の論理IDに戻すことが非常に簡単になったので、私は本当にこれを使用しました(IDを削除できることに留意してください!)
ありがとう!
解決
私はあなたが持っているものに何も悪いことを見ていません、そして私はあなたが説明する行動を経験したことがありません。ただし、迅速な解決策は、割り当てラインを次のようなものに置き換えることです。
$output[$id['GalleryPhotoID']] = $gp;
あなたもできます echo $gp->GalleryPhotoID;
それを確実にするため GalleryPhotoID
プロパティは実際にそのようにアクセスできます。
最後に、上記の行を次のようなものに置き換えたと言いました。
$output['foobar'] = $gp;
そして、それはまだエントリごとに整数キーを備えた新しいエントリを作成しましたか?もしそうなら、あなたが省略したコードに問題を引き起こしている何かがあるかもしれないと思います。
他のヒント
ずっとフェイスパーム。新年の排水はまだ私の脳にあるに違いありません。そうでなければ、アルバムカバーのサムネイルをフェッチするために追加した機能が、アルバムコバープロパティセットの写真がない場合、アレイをシャッフルしたことに気付きました。
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);
}
あなたの警告が私を私のエラーに導くので、私は答えとコメントの両方を受け入れて支持しました。みんなありがとう!