連想配列とオブジェクト配列の使い分けとは?

このQ&Aのポイント
  • データベースで結果を取得する場合など、連想配列のままではなく何故、わざわざオブジェクトに格納する様な手法が使われるのでしょうか?
  • 連想配列のままで処理するほうが早いと思いますし、それに付随するクラスファイルも多くなります。また、「結びつきを緩くして仕様変更に耐えうる様に」など聞きますが、余計複雑になってしまう様な気がしますので、メリットが今ひとつ分からず判断に迷ってしまいます。
  • どの様な使い分け、考え方をすれば良いかアドバイスいただけたら幸いです。
回答を見る
  • ベストアンサー

連想配列、オブジェクト配列の使い分け

お世話になります。 データベースで結果を取得する場合など、連想配列のままではなく何故、わざわざオブジェクトに格納する様な手法が使われるのでしょうか? 連想配列のままで処理するほうが早いと思いますし、それに付随するクラスファイルも多くなります。また、「結びつきを緩くして仕様変更に耐えうる様に」など聞きますが、余計複雑になってしまう様な気がしますので、メリットが今ひとつ分からず判断に迷ってしまいます。 どの様な使い分け、考え方をすれば良いかアドバイスいただけたら幸いです。 何卒、宜しくお願いします。 例) ※必要と思われる部分のみ記述しております。 ■連想配列 while($row=mysql_fetch_assoc($res)){ ~以下必要な処理} ■オブジェクト配列 while($row=mysql_fetch_assoc($res)){ $example = new Example(); $example->setName($row['name']); $example->setAddr($row['addr']); $array[] = $example } ~以下必要な処理 ○モデル class Example { private $_name = null; private $_addr = null; public function __construct() {} public function setName($name) { $this->_name = (string) $name; return $this; } public function getName() { return $this->_name; } public function setAddr($addr) { $this->_addr = (string) $addr; } ~以下省略 }

  • jone
  • お礼率94% (18/19)
  • PHP
  • 回答数1
  • ありがとう数1

質問者が選んだベストアンサー

  • ベストアンサー
回答No.1

こういう処理をO/Rマッピングと言いませんか? O/Rマッピングにはメリット・デメリットがあります。 メリットはざっくり言えば変換後はオブジェクト指向の世界のことだけを考えればよくなるということです。データの取得、設定はsetter / getterで行えますし、一連のデータの受け渡しもオブジェクトの受け渡しとして描かれます。 デメリットはメモリーが無駄に使われて、性能が出ないということに尽きるでしょうね。O/Rマッピングの段階で抽象化されてしまい、RDBのことを綺麗サッパリ忘れるので、RDBだとインデックスを使って高速にデータを選択できるところがそれを使わないために遅くなったり、無駄なメモリーを使ったりすることになります。O/RマッパーによってはSQLを直書きできるオプションを用意しているものもありますが、あまり筋がいいとは思えません。 あと、PHPだと簡単に連想配列を作れるので、わざわざオブジェクトを作ってもあまり嬉しくないかもしれません。JavaだとHashMapなどで連想配列を作るのにもそれなりのコストが掛かりますし、オブジェクトにしたほうが型のチェックもしてくれますのでオブジェクトにする利点はPHPに比べてはるかに大きいとは思いますが。 O/Rマッピングで検索すると賛否両論見つかると思うので、まぁ、見てみてください。個人的にはRDBを裏で使うなら、強く型づけされた言語でもあるまいし、連想配列の配列で良くない?と思ってしまいますが...

jone
質問者

お礼

hanabutako様 早々のご回答有難う御座います。 > O/Rマッピングと言いませんか? すみません、出題に入れた方が適切でしたでしょうか。。 なるほど、言語の仕様によるのですね。 何か、何でも「オブジェクト指向で・・・」ってするのが望ましい的な強迫観念?を抱いてしまい、気がつけば、オブジェクト指向、非オブジェクト指向ごちゃごちゃのPGになってしまって悲しい限りです(恥) >O/Rマッピングで検索すると 有難う御座います。 はい、沢山出てきますね、、ActiveRecordとかデータマッパーとか・・・ 色々ありすぎて訳分からなくなってしまいそうです。。 でも、hanabutako様に「連想配列の配列で良くない?」と言われますと、背中を押して下さった様な気がしますので、踏ん切りがつきました。 変に気張らずに「連想配列」を使用したいと思います。 有難う御座いました。 今後とも宜しくお願いします。

関連するQ&A

  • 連想配列と添字配列の違いについて

    MySQL初心者です。 mysql_fetch_arrayとmysql_fetch_assocの違いがいまいち理解できません。 ネットで調べると mysql_fetch_array — 連想配列、添字配列、またはその両方として結果の行を取得する mysql_fetch_assoc — 連想配列として結果の行を取得する と書かれていますが、連想配列と添字配列の違いが理解できませんでした。 全くの初心者でもわかるようにそれぞれの違いを教えていただけませんか? よろしくお願いします。

    • ベストアンサー
    • MySQL
  • smartyでMySQLから連想配列取り出しと表示

    フォーム(POST)を使ってMySQLにデータを挿入し、 mysql_fetch_assocにて連想配列で取り出して、 whileで表示する場合、 ======================================== $sql = "SELECT * hogehoge"; $result = mysql_query($sql); while ($row = mysql_fetch_assoc($result)) { echo $row["userid"]; echo $row["name"]; echo $row["sex"]; } ======================================== とすれば、MySQLから値を取りだして表示できます。 ただ、それをsmartyに置き換えて以下のようにすると、 ======================================== {foreach from=$row item=hoge} <tr> <td>{$row.userid}</td> <td>{$row.name}</td> <td>{$row.sex}</td> </tr> {/foreach} ======================================== 同じ値が$rowの値の数だけ返されてしまいます。 例だと、 1 太郎 男 2 花子 女 3 一郎 男 4 陽子 女 5 良子 女 と表示したいものが、 1 太郎 男 1 太郎 男 1 太郎 男 となってしまいます。 これを解決するには、どのようにすればよろしいのでしょうか?

    • ベストアンサー
    • PHP
  • 配列や連想配列について

    言語一般の配列や連想配列について 最近どういう解釈をしていいのか わからなくなってしまいました。 仮にPerlで話をさせてもらいますと、 連想配列%FORMがあるとき、 個々の要素にアクセスする場合 例えば$FORM{'name'}などと記述しますが、 この$FORM{'name'}を みなさんはどのように解釈しているでしょうか? $FORM{' '}にキー nameを 代入しているようなイメージで、 「連想配列%FORMからキー'name'の値を取得する」 という考え方でしょうか? わたしは最近、 $FORM{'name'}はそれ自体が一つの変数という 考え方が出来るのではないかという気がしているのですが、 連想配列の実装から考えると この考え方は正しいのでしょうか? 以前、配列について同様の質問を したことがあります。 例えばC言語でint a[100]と宣言した場合は、 連続的なアドレスに確保されるため、 a[2]はaという名前のアドレスから a + 2 番目の場所という意味になるが、 言語によっては不連続なアドレスに 確保されるため、a[2]は一つの変数名として 考える必要がある・・ との回答でした。 ならば連想配列の場合も もし不連続なアドレスに確保されるならば、 $FORM{'name'} は一つの変数名と 考えたほうが正しいのではないかと 思ったからです。 連想配列の内部的な処理がどうなっているのか 教えて頂きたいです。 よろしくお願いします。

    • ベストアンサー
    • Perl
  • SQL文の実行結果を変数で受けて、それを連想配列に格納したいです。

    SQL文の実行結果を変数で受けて、それを連想配列に格納したいです。 (カラム名を連想配列のキーにします。) また、値をHTMLエスケープ処理したいと考えています。 下記のソースを書いてみましたが、配列$all[]にうまく入りません。 $qresult = mysql_query($qstring); $all = array(); while (list ($key, $val) = mysql_fetch_assoc($qresult)){  $all[$key] = htmlentities($val, ENT_QUOTES,EUCJP); } また、3行目をeach(mysql_fetch_assoc($qresult))に変更してもみましたが、 「Variable passed to each() is not an array or object」エラーが出ます。 mysql_fetch_assocの戻り値は連想配列では無いのでしょうか。 $qresult = mysql_query($qstring); $all = array(); while ($rec = mysql_fetch_assoc($result)){  $all[] = $rec; } 上記だと問題なく取得出来るのですが。。。 何が悪いのでしょうか。

    • ベストアンサー
    • PHP
  • 連想配列の初期化

    UNIXでAWKの連想配列を使っています。 連想配列を処理の途中で初期化したいのですが、どうすれば良いのでしょう? とりあえず今は以下のように初期化をしています。 for ( i in a ){a[i]="";} しかし、できれば a=null という感じに一発で初期化をしたいのです。

  • SQLのデータから連想配列を作成したい

    あるPHPがあります。 このPHPは配列$food = array('orange','apple','sugar','spice','cake');を基にさまざまな処理を行っているのですが、 配列内部の要素の数が大きくなってきたので、sqlを使用して$foodを作成しようと思います。 データベース名dbname、テーブル名Tableとして、nameカラムのデータから$foodを作成…つまり、 ---------------------- Table  ------+ name | ------+ orange apple sugar spice cake ---------------------- ↓ ↓ $food = array('orange','apple','sugar','spice','cake'); などとしたいのです。 mysql_fetch_arrayなどを使用すればできると思うのですが、自分ではどうにもうまくいきません。 ↓はgoogleでの検索条件を基に、私が書いたコードです <?php $link = mysql_connect( $hostname, $uname, $upass); mysql_select_db( $dbname, $link) $res = mysql_query( "SELECT * from {$name}", $link); while( $food = mysql_fetch_assoc( $res ) ){ } ?> どこのコードがおかしいのか教えてください。 また、できれば上のデータベースから$foodを作成するPHPを教えてください。 どなたかご教示のほど、どうかよろしくお願いします。

    • ベストアンサー
    • PHP
  • データベースから多次元連想配列でデータを取得できない

    PHP,MySQLともに初心者です いろんなサンプルプログラムを見て少しずつ進めているのですが、本3冊にネットで検索しても解決できないので・・・ function getSelect($field,$table,$where){ $query="select $field from $table $where;"; $result=$this->getResult($query); return $result; } $result=$db->getSelect("*","main","where myouji=$_POST[myouji]"); while($row = mysql_fetch_array($result[result])){ echo "$row[id]"; } こんな感じでmainテーブルからmyoujiに該当するrowを取得したのですが、 Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in とエラーが出てしまいます。 他のところで、 $result=$db->getSelect("*","main","where id=$_POST[id]"); $rows=mysql_fetch_array($result[result]); としたときはエラーなく行くのですが、上のような多次元連想配列(下の方はidを重複させてないので必ずrowが1つ・・・1次元連想配列?)になるとエラーになってしまいます。 これはどう修正すればいいのでしょうか。 たったこれ1行のつまづきで4時間くらいかかってます。 誰か助けてください

    • ベストアンサー
    • PHP
  • foreachで配列を作る

    $array = array("id","name","address","tel","point","a1"); $res = $db->query($sql);  //sqlのクエリー while ($row = $res->fetchRow( DB_FETCHMODE_ASSOC )) { $data_list[]=array( $array[0]=>$row["$array[0]"], $array[1]=>$row["$array[1]"], $array[2]=>$row["$array[2]"], $array[3]=>$row["$array[3]"], $array[4]=>$row["$array[4]"], $array[5]=>$row["$array[5]"]); } をforeachを使って $array = array("id","name","address","tel","point","a1"); $res = $db->query($sql);  //sqlのクエリー while ($row = $res->fetchRow( DB_FETCHMODE_ASSOC )) { foreach(~){             //処理     } のようにかきかえたいのですがどうしたらいいでしょうか?foreachをしらべていろろやったのですがうまくいきません。よろしくおねがいします。  ちなみに$data_list[]の配列はArray ( [0] => id [1] => name [2] => address [3] => tel [4] => point [5] => a1 ) Array ( [0] => Array ( [id] => 0 [name] => ここあ [address] => 東京 [tel] => 2 [point] => 2 [a1] => 2 ) [1] => Array ( [id] => 1 [name] => 太郎 [address] => 東京 [tel] => 3 [point] => 5 [a1] => あ ) [2] => Array ( [id] => 4 [name] => 五郎 [address] => 東京 [tel] => 0 [point] => 1 [a1] => あああああ ) [3] => Array ( [id] => 5 [name] => 士郎 [address] => 神奈川 [tel] => 26 [point] => 5 [a1] => ああああああああああ ) …となります。

    • 締切済み
    • PHP
  • XML初心者です。

    いつもお世話になっております。 下記のPHPを解析中なのですが、さっぱり分かりません。 「何をしているか(どんな動きをしているか)」をどなたか解説していただけませんでしょうか。 よろしくお願い致します。 ----------------------------------- <?php class EditableGrid { (略) public function addColumn(・・・(略)・・・) { $this->columns[$name] = array(・・・(略)・・・); } private function _getRowField($row, $field) { return is_array($row) ? (isset($row[$field]) ? $row[$field] : '') : (isset($row->$field) ? $row->$field : ''); } public function getXML((・・・(略)・・・)); { $xml = '<?xml version="1.0" encoding="'. $this->encoding . '" ?>'; $xml.= "<table><metadata>\n"; foreach ($this->columns as $name => $info) { $label = self::escapeXML($info['label']); $xml.= "<column name='$name' label='$label' datatype='{$info['type']}'". ($info['bar'] ? "" : " bar='false'") . " editable='". ($info['editable'] ? "true" : "false") . "'>\n"; if (is_array($info['values'])) { $xml.= "<values>\n"; foreach ($info['values'] as $key => $value) $xml.= "<value value='{$key}'><![CDATA[{$value}]]></value>\n"; $xml.= "</values>\n"; } $xml.= "</column>\n"; } $xml.= "</metadata><data>\n"; $fetchMethod = method_exists($rows, 'fetch') ? 'fetch' : (method_exists($rows, 'fetch_assoc') ? 'fetch_assoc' : NULL); if (!$fetchMethod) foreach ($rows as $row) $xml.= $this->getRowXML($row, $customRowAttributes, $encodeCustomAttributes); else while ($row = call_user_func(array($rows, $fetchMethod))) $xml.= $this->getRowXML($row, $customRowAttributes, $encodeCustomAttributes); $xml.= "</data></table>\n"; return $xml; } ----------以下まだ続くのですが省略します-------- private function getRowXML  ・  ・ (略)  ・  ・ public function renderXML  ・  ・ (略)  ・  ・ } 以上

    • ベストアンサー
    • PHP
  • PHPの書き方について

    PHPを独学で勉強中で、気になったことがあるので質問させていただきます。 最初に買った書籍とその次に買った書籍で書き方が違うところがあるので、普通はどちらでやるのか、また、使い分けがあるのかが知りたいです。 たとえば、データベースを1行ずつ取り出す処理で、1冊目では $pdo = new PDO($dnsinfo,$USER,$PW); $sql = "SELECT * FROM ○○"; $stmt = $pdo->prepare($sql); $stmt->execute(null); $res = ""; while($row = $stmt->fetch(PDO::FETCH_ASSOC)){ $res .= $row['△△'] ."," .$row['□□'] ."<br>\n"; } ・・・というコードがあったのですが、2冊目には同じような処理が mysqli_fetch_assoc()を使って書かれていたり、 接続の仕方も1冊目では「new PDO($dnsinfo,$USER,$PW);」を使って書かれているのが、2冊目では「mysqli_connect()」になっていたり、 他にも同じような処理がよく似たコードで書かれています。 調べてみると、PHP5.5から1冊目のやり方になった・・・ような記事を見つけたのですが、どちらの本もPHP5.5と書いてあり、いまいちよくわかりません。 詳しい方いらっしゃいましたらご教示お願いいたします。

    • ベストアンサー
    • PHP

専門家に質問してみよう