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

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

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

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

Q&A

解決済

2回答

1869閲覧

データをファイルで管理しています。

jk233

総合スコア55

PHP

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

0グッド

0クリップ

投稿2015/04/10 07:38

編集2015/04/10 07:44

商品マスタと受注データを以下のファイルで管理しています。

【item.csv】
1,たまご
2,牛乳
3,ピーマン

【order.csv】
2,400
3,100
1,8
2,20

index.phpは以下の実装です。

lang

1//受注データ読み込み 2$file = explode("\n", file_get_contents("order.csv")); 3foreach ($file as $line) { 4 //商品コード、数量 5 list($itemCd, $suryo) = explode(",", $line); 6 //インスタンスの配列 7 $orderList[] = new Order($itemCd, $suryo); 8} 9 10 11foreach ($orderList as $order) { 12…以下略… 13 14//Orderクラス 15class Order { 16 private $itemCd;//商品コード 17 private $itemName;//商品名 18 private $suryo;//数量 19 20 function __construct($itemCd, $suryo) { 21 22 $this->itemCd = $itemCd; 23 $this->suryo = $suryo; 24 25 //商品マスタから商品名を調べる 26 $file = explode("\n", file_get_contents("item.csv")); 27 foreach ($file as $line) { 28 list($cd, $name) = explode(",", $line);//商品コード、商品名 29 if ($cd === $itemCd) { 30 $this->itemName = $name; 31 break; 32 } 33 } 34 } 35}

これでも動くのですが、Orderクラスをnewするたびにitem.csvを読み込みに行ってしまいます。
もっと効率のよい書き方はないでしょうか。
よろしくお願いします。

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

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

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

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

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

guest

回答2

0

ベストアンサー

class Items { private static $instance; private $items = array(); public static function getInstance() { if (self::$instance === null){ self::$instance = new self; } return self::$instance; } private function __construct() { $file = explode("\n", file_get_contents("item.csv")); foreach ($file as $line) { list($cd, $name) = explode(",", $line);//商品コード、商品名 $this->items[$cd] = $name; } public getItems() { return $this->items; } } $items = Items::getInstance()->getItems();

あとは全く同じ。

こんな感じでどうでしょう?

投稿2015/04/10 08:18

編集2015/04/10 08:20
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

退会済みユーザー

退会済みユーザー

2015/04/10 08:22

そうすると$itemsの引き渡しは必要なくなるから $file = explode("\n", file_get_contents("order.csv")); foreach ($file as $line) { //商品コード、数量 list($itemCd, $suryo) = explode(",", $line); //インスタンスの配列 $orderList[] = new Order($itemCd, $suryo); } //Orderクラス class Order { private $itemCd;//商品コード private $itemName;//商品名 private $suryo;//数量 function __construct($itemCd, $suryo) { $this->itemCd = $itemCd; $this->suryo = $suryo; $items = Items::getInstance()->getItems(); $this->itemName = isset($items[$itemCd])? $items[$itemCd] : ""; } } こっちか。
jk233

2015/04/10 08:59

やりたかったことと完全に一致しました。 ありがとうございました。
guest

0

幾らでもやり方はありますが、とりあえずI/Oを最初に1回だけして、あなたのコードを活かすとこんな感じ。

$items = array();
$file = explode("\n", file_get_contents("item.csv"));
foreach ($file as $line) {
list($cd, $name) = explode(",", $line);//商品コード、商品名
$items[$cd] = $name;
}

$file = explode("\n", file_get_contents("order.csv"));
foreach ($file as $line) {
//商品コード、数量
list($itemCd, $suryo) = explode(",", $line);
//インスタンスの配列
$orderList[] = new Order($itemCd, $suryo, $items);
}

//Orderクラス
class Order {
private $itemCd;//商品コード
private $itemName;//商品名
private $suryo;//数量

function __construct($itemCd, $suryo, $items) { $this->itemCd = $itemCd; $this->suryo = $suryo; $this->itemName = isset($items[$itemCd])? $items[$itemCd] : ""; }

}

PHPの場合、変数引き渡しは全て参照で行われ、内容を変更する場合に複製が作られてメモリを消費するはずなので、この場合はずっと参照で行われ、メモリは最初の1回分だけのはずです。

まぁ、ファイルで運用なんかしないでDB使いたいですね。

投稿2015/04/10 07:57

編集2015/04/10 07:59
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

jk233

2015/04/10 08:07

ご回答ありがとうございます。 index.php側には商品マスタを見に行く処理を隠蔽したいのですが、そういったことは可能でしょうか? >ファイルで運用なんかしないでDB使いたいですね。 仰るとおりで...
退会済みユーザー

退会済みユーザー

2015/04/10 08:13

そうすると、シングルトンモデルになりますね。
退会済みユーザー

退会済みユーザー

2015/04/10 08:18

コード書くので別スレッドにしました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問