質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

オブジェクト指向

オブジェクト指向プログラミング(Object-oriented programming;OOP)は「オブジェクト」を使用するプログラミングの概念です。オブジェクト指向プログラムは、カプセル化(情報隠蔽)とポリモーフィズム(多態性)で構成されています。

Q&A

0回答

1398閲覧

データを管理するクラスの作り方

msx2

総合スコア174

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

オブジェクト指向

オブジェクト指向プログラミング(Object-oriented programming;OOP)は「オブジェクト」を使用するプログラミングの概念です。オブジェクト指向プログラムは、カプセル化(情報隠蔽)とポリモーフィズム(多態性)で構成されています。

0グッド

1クリップ

投稿2018/06/05 09:12

編集2018/06/06 03:10

商品データベースの商品画像を管理するクラスを作りました。

ある商品に関連づけられる画像には区分で分類されています。
(画像区分2種 × 重要度3種 = 6パターン)

【画像区分】
共通・個別

【重要度】
高・中・低

PHP

1//画像管理クラス 2class ImageManager { 3 4 //画像データ 5 private $_image_data = []; 6 7 //出力順序 8 private $_output_order; 9 10 public function __construct(){ 11 12 $this->_image_data = [ 13 'common' => [ 14 'imp_high' => ['images' => [] ], 15 'imp_middle' => ['images' => [] ], 16 'imp_low' => ['images' => [] ] 17 ], 18 'individual' => [ 19 'imp_high' => ['images' => [] ], 20 'imp_middle' => ['images' => [] ], 21 'imp_low' => ['images' => [] ] 22 ], 23 ]; 24 25 //出力の順序を決める 26 $this->_output_order[] = &$this->_image_data['common']['imp_high']; 27 $this->_output_order[] = &$this->_image_data['common']['imp_middle']; 28 $this->_output_order[] = &$this->_image_data['common']['imp_low']; 29 $this->_output_order[] = &$this->_image_data['individual']['imp_high']; 30 $this->_output_order[] = &$this->_image_data['individual']['imp_middle']; 31 $this->_output_order[] = &$this->_image_data['individual']['imp_low']; 32 33 } 34 35 public function get_images() 36 { 37 foreach($this->_output_order as $images) 38 { 39 foreach($images['images'] as $img) 40 { 41 yield $img; 42 } 43 } 44 } 45 //画像を追加 46 public function add($img_kbn, $importance,$image) 47 { 48 $this->_image_data[$img_kbn][$importance]['images'][] = $image; 49 }

上記プログラムはなかり簡略化してしまったので間違っているかもしれませんが、
目的は区分/重要度別に画像を保持することと取り出しの順序の管理です。

データの入れ物は配列で作ってしまいました。
画像区分と重要度をキーにして必要なデータにアクセスできるので便利です。

出力順はコンストラクタで$this->_output_orderの配列に参照を入れています。
仕様変更で出力の順を変えたくなったらここを変更すればいいと思ったからです。

今のところ問題なく動いていますが、配列や参照を使ったこのプログラムは古いように思えます。

現在プログラムの見直しをしていまして、配列ではなくオブジェクトを使った分かりやすい実装に変えることができないか検討しています。

ここからが質問です(前置き長くてスイマセン)

画像を入れておく配列を下記クラスと置き換えてみました。

PHP

1class ImageBox { 2 private $img_kbn; 3 private $importance; 4 private $images = []; 5 6 public function __construct($img_kbn,$importance){ 7 $this->img_kbn = $img_kbn; 8 $this->importance = $importance; 9 } 10 public function add($image){ 11 $images[] = $image; 12 } 13 public function get(){ 14 return $images; 15 } 16}

最初のプログラムは下記となります。

PHP

1//画像管理クラス 2class ImageManager { 3 4 //画像データ 5 private $_image_data = []; 6 7 //出力順序 8 private $_output_order; 9 10 public function __construct(){ 11 12 $this->_image_data = [ 13 new ImageBox('common','imp_high'), 14 new ImageBox('common','imp_middle'), 15 new ImageBox('common','imp_low'), 16 new ImageBox('individual','imp_high'), 17 new ImageBox('individual','imp_middle'), 18 new ImageBox('individual','imp_low'), 19 ]; 20 21 //出力の順序を決める 22 $this->_output_order[] = $this->_image_data[0]; 23 $this->_output_order[] = $this->_image_data[1]; 24 $this->_output_order[] = $this->_image_data[2]; 25 $this->_output_order[] = $this->_image_data[3]; 26 $this->_output_order[] = $this->_image_data[4]; 27 $this->_output_order[] = $this->_image_data[5]; 28 } 29 30 public function get_images() 31 { 32 foreach($this->_output_order as $images) 33 { 34 foreach($images->get() as $img) 35 { 36 yield $img; 37 } 38 } 39 } 40 //画像を追加 41 public function add($img_kbn, $importance,$image) 42 { 43 //ここがわかりません 44 }

ImageManagerクラスのaddメソッドについて質問ですが

引数で与えられた$img_bknと$importanceから該当するImageBoxオブジェクトを選択して画像を追加したいのですが、どのようにImageBoxオブジェクトを探すのがいいでしょうか?

foreachで回しながら1つ1つ確認する方法しか思いつきません。

これならキーでアクセスできる配列の方がわかりやすい感じがしますが、データのチェックなど配列ではできない処理を実装する予定なので配列はやめようと思います。

よろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

mather

2018/06/05 09:17

「配列ではなくオブジェクト」と言っている「オブジェクト」とは何のことですか?連想配列なのか、別のクラスなのか。
msx2

2018/06/06 03:11

質問がわかりにくくて申し訳ありません。質問したいポイントを絞ってみました。
matsuand

2018/12/28 09:03

回答ではないですが、$this->_output_order[] = $this->_image_data[0]; と書いている時点で、ImageManager は、配列のゼロ番目に 'common' の 'imp_high' が入っていることが分かっているわけですから、これを許容するのであれば、add メソッドでも、'common' の 'imp_high' であれば、ゼロ番目に追加するという作りになると思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問