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

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

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

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

Q&A

解決済

6回答

964閲覧

ロジックを考える力について

nedekee

総合スコア4

PHP

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

0グッド

0クリップ

投稿2020/06/16 03:09

編集2020/06/16 07:17

皆さまこんにちは。

現在自身のロジック力が壊滅的なので勉強中です。
最初の質問が簡易的過ぎたのと、仕様が変わったなどありましたので今更ながら修正します。

例えばファイルを読み込んで、最終的には出力が、

奇数行の時にはaファイルへ保存
偶数行の時にはbファイルへ保存

というような処理にしたいです。

読み込むファイルは、お客様情報が2行1セットになっている
下記のようなtxtファイルです。

id,購入品,個数,価格,注文番号,お客様番号,お名前,生年月日,住所,作成日 1,お餅,10,200,0001,11111,null,null,null,201206161200 →aファイル(お客様注文ファイル.txt)へ保存 2,null,null,null,null,11111,テスト太郎,19800101,千葉県ほげ区,201206161200 →bファイル(お客様情報ファイル.txt)へ保存

ファイル出力結果↓↓↓

a.txt商品データ id,購入品,個数,価格,注文番号,お客様番号,作成日 1,お餅,10,200,0001,11111,202006161200 b.txt顧客データ id,お客様番号,お名前,生年月日,住所,作成日 1,11111,テスト太郎,19701201,千葉県ほげ区,202006161200

上記を踏まえ現状下記のようにして実装としました。

//test.txt//////////////////////////////////////////////////////// //id,購入品,個数,価格,注文番号,お客様番号,お名前,生年月日,住所,作成日 //1,お餅,10,200,0001,11111,'','','',202006161200 //2,'','','','',11111,テスト太郎,19800101,千葉県ほげ区,202006161200 ////////////////////////////////////////////////////////////////// $data = file_get_contents('test.txt'); $data = mb_convert_encoding($data,'utf-8','sjis'); // 行ごとに分解:1行目:ヘッダ、以降奇数:注文情報、以降偶数:お客様情報 $data = explode("\n",$data); $header = explode(',',$data[0]); //ヘッダ格納 file_put_contents('order.txt',$header[0].',',FILE_APPEND); // 注文情報ファイルへ保存 file_put_contents('order.txt',$header[1].',',FILE_APPEND); // 注文情報ファイルへ保存 file_put_contents('order.txt',$header[2].',',FILE_APPEND); // 注文情報ファイルへ保存 file_put_contents('order.txt',$header[3].',',FILE_APPEND); // 注文情報ファイルへ保存 file_put_contents('order.txt',$header[4].',',FILE_APPEND); // 注文情報ファイルへ保存 file_put_contents('order.txt',$header[5].',',FILE_APPEND); // 注文情報ファイルへ保存 file_put_contents('order.txt',$header[9],FILE_APPEND); // 注文情報ファイルへ保存 file_put_contents('customer.txt',$header[0].',',FILE_APPEND); // お客様情報ファイルへ保存 file_put_contents('customer.txt',$header[5].',',FILE_APPEND); // お客様情報ファイルへ保存 file_put_contents('customer.txt',$header[6].',',FILE_APPEND); // お客様情報ファイルへ保存 file_put_contents('customer.txt',$header[7].',',FILE_APPEND); // お客様情報ファイルへ保存 file_put_contents('customer.txt',$header[8].',',FILE_APPEND); // お客様情報ファイルへ保存 file_put_contents('customer.txt',$header[9],FILE_APPEND); // お客様情報ファイルへ保存 $cnt = count($data); //1行目[0]はヘッダなので飛ばす for ($i=1; $i < $cnt; $i++) { // 奇数の場合 お客様情報ファイルとして保存 if ($i % 2 != 0) { file_put_contents('order.txt',str_replace('\'\',','',$data[$i])."\n",FILE_APPEND); // 偶数の場合 お客様注文ファイルとして保存 } else { file_put_contents('customer.txt',str_replace('\'\',','',$data[$i])."\n", FILE_APPEND); } }

file_put_contensのあたりとかファイルの存在確認とか書きようがまだあるのかなと思いますが、
ちょっと他の案が思い浮かばずです。
何となくで上手く行った→これ以上自分で突き詰められないので次へ、といった繰り返しで
皆さまの様な綺麗なコードにすることが出来ず困っています。
このようなコードのロジック力を鍛えるにはどのような練習が効果的でしょうか?
やはり我武者羅にコードを組み上げるしかないのでしょうか?
有識者様方々の厳しいご指導・ご指摘をお待ちしております。
またコードに対する突っ込みもあればお願いします。
何卒宜しくお願い致します。

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

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

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

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

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

miyabi_takatsuk

2020/06/16 03:17 編集

ロジック力云々の前に、エラーが出てるなら、そのエラー文を元に調査することを学びましょう。 ロジック力の前にそこからです。 というわけで、エラーが出てたら、エラー文を質問に記載して下さい。
Daregada

2020/06/16 03:19

ええと、「偶数行と奇数行で何か違う処理をしたい」のでしょうか。質問文には書かれていませんが。 もし、単に「ファイルの内容を行番号付きで表示したい」ということなら、偶数行と奇数行に分けて処理する必要はありません。
dodox86

2020/06/16 03:46

頭の中でロジックが組み上がる前にコーディングしていませんか。で、自分の書くコードに振り回されていませんでしょうか。がむしゃらに組み上げても時間の浪費だと思います。
nedekee

2020/06/16 07:22

miyabi_takatsuk様 ご回答有り難う御座います。 エラーは現在出ておりませんが、最近はnotice等消していたので error_reportingもしっかり出して検証していきます。 Daregaba様 ご回答有り難う御座います。 「偶数行と奇数行で何か違う処理をしたい」 上記のご認識で合っています(質問修正しました) dodox86様 ご回答有り難う御座います。その通りだと思います。 どうにも先走って質問してしまいました。 恥ずかしながら組み立てるにも引き出しが少なく、 かといってかような初歩を会社で聞くわけにもいかず。。。 実装の意図を考えて組むようにいたします。
kai0310

2020/06/18 08:00

ファイルに保存するという手法自体である程度のコード量は必要かと。。 初学者はクラス・関数を使わなかったりすると思うのでそれも原因かも
guest

回答6

0

ベストアンサー

このようなコードのロジック力を鍛えるにはどのような練習が効果的でしょうか?

検索してみたら出てきたページですが
ロジカルシンキングとは?意味・構成要素や訓練方法を解説

プログラム作る人はみんな4番と5番をやってるかなと、無意識の人がほとんどでしょうが、意識することでやれるなら意識してやればいいです。
4番が出来てなきゃ5番は出来ないし、それ以外の番号は全て5番に包括されている
紹介したサイトはプログラムの話ではありませんが、プログラムを作る上でも同じ事かと

一度に全ての結果を出すんじゃなくて一つずつやってみるのはどうでしょうか?
・行数を出す処理
・行数を元に判定する処理
・ファイルの中身を取得する処理
もっとバラせるならバラして(4番)。バラした分だけ処理が正しいかの確認(5番)もし易くなります

投稿2020/06/16 03:45

hentaiman

総合スコア6426

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

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

nedekee

2020/06/16 07:24

hentaiman様 ご回答有り難う御座います。 サイトのご提示有難う御座います。 細部から作るというのは良く講座等でもお聞きします。 気づいたら変数の間違いや、引数の間違いという些細なミスが多い 自分にも有効だと思いました。 考え方として参考にいたします。
hentaiman

2020/06/16 08:34

細部から作るのではなく細分化です。大枠から作ったとしても問題ありません。
guest

0

「ロジック力」の涵養に集中したいなら、まずプログラムにやらせるべきことを日本語で書き出してみてはどうでしょう。
提示のプログラムは何をやらせたかったのでしょうか。こんな感じでしょうか?

  • テキストの内容の出力
  •  奇数行と偶数行でスタイルを違えて出力
  •   奇数行では…
  •   偶数行では…

既に組んであるコードを吟味する上でも日本語は大切です。
たとえば、

$even += $odd + 1;

何のためにこれが必要なのか簡潔な日本語で説明できるでしょうか。その確認が曖昧のままフィーリングで書いてしまってるのではないですか?
ブロックごと行ごとに「日本語で説明」してみようとすれば、提示されているプログラムの、特に$evenや$oddの変数の有り様がかなり奇怪だと分かると思うのです。

もうひとつは「アルゴリズム辞典」のようなものを買って、定石と言えるコードの組み方の型紙のようなものを勉強してみること。

それから、デバッガの話が出ていますが、もうひとつ「プロファイラ」というツールもロジックに穴がないか確認するのに有効です。PHPで使いやすいのがあるのか私は知りませんが。

投稿2020/06/16 06:41

KojiDoi

総合スコア13692

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

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

nedekee

2020/06/16 07:39

KojiDoi様 ご回答有り難う御座います。 やりたかったことについては修正した質問の通りでございます。 日本語で書きだすのは良さそうですね。日本語でコメントを書く→コメントの通りにコードを書く、 この手順で試してみます。 「アルゴリズム」や「デザインテンプレート」といった定石もまだ理解していない部分なので 勉強してみます。 「プロファイラ」、これも初耳です。いやはや知らないことばかりで。 大変為になる情報を有り難う御座います!
guest

0

意図した挙動になっているか確認するには、デバッグ環境を整えて、ステップ実行しながら変数の変化を追うのが手っ取り早いです。

投稿2020/06/16 03:12

編集2020/06/16 03:13
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

nedekee

2020/06/16 03:17

ご回答有り難う御座います。 現在phpstorm+xampp(php7.2)にて試しています。 var_dumpなど駆使してもう少し詰めてみます。
退会済みユーザー

退会済みユーザー

2020/06/16 03:38 編集

var_dump() でステップ毎の変数変化を追うのはあまり良い手ではないです。 https://xdebug.org/ を使用することをオススメします。
nedekee

2020/06/16 07:28

xdebugは設定段階で何度もつまずいており、 これまでvar_dump()ばかり使っていました^^; 先ほど色々調べてローカルホストのphp側はxdebugの実行に成功しました。 有り難う御座います! 先日構築したlaravel環境にも適用をと考えているのですが、異なるローカル環境(php/laravel)で同じ? xdebugを使うのはそもそも問題ないでしょうか?
guest

0

タグが「PHP」だけなのが勿体ない。
既に解決してるようですが、思うところを。

皆さまの様な綺麗なコードにすることが出来ず困っています。

「綺麗なコード」という個人の感覚で表現しようとすると、止まります。
「整合性のとれたコード」「無理無駄がないコード」「変数名、関数名が見ただけで役割が分かる」「コメントが適切に書かれている」など、より具体的な表現してください。
「なぜ綺麗だと感じたのか説明できますか?」と聞かれて、ちゃんと説明できるほどに。
コードは書いた通りにしか動きませんから、「綺麗」というのは実際は存在しえない概念です。絵や風景とは違いますから。

コードは短ければ短いほど良いというわけではありません。

・要件を満たせていてバグがないこと  が絶対で
・効率的、速度、メンテナンス性 などはその次です。

動いているならまずそこでステップ1が完了なのです。

ステップ2からはいわゆる「リファクタリング」ですが、やろうと思えばどこまででもできてしまうので、「観点」や「具体的な目的」が必要です。

これも今質問者さんがされているように、あっちをチョコチョコ、そっちをチョコチョコ、気になるところを気になるだけ弄るのではなく、
幾つかのフェーズに分けて、作業を明確化、細分化し、段階的に対応します。

例えば
0. 変数名の正規化の検討
0. 分岐の正当性の検討
0. 使用されない処理の検討
0. 冗長な処理の簡素化の検討
0. 同様の記述の共通化の検討
0. 他でも使えそうな機能の切り出しの検討

など。

具体的であればあるほど良く、細分化されていればいるほど各フェーズのメリハリがつきます。フェーズをこなすごとにチェックしていくと「良くなっている姿」も見えてきます。

そして、どのフェーズも目的を明確にしているため、「考えながらやる」ことはできません。
全体を把握したうえで洗い出し、しっかり考えてから対応することになります。

結局は全体の整合性がとれていないとリファクタリングをしたところで、新たなバグを生むだけですからね。

このようなコードのロジック力を鍛えるにはどのような練習が効果的でしょうか?

やはり我武者羅にコードを組み上げるしかないのでしょうか?

がむしゃらに組み上げたところでがむしゃらなコードにしかなりません。
アプリケーションは何かしらの目的を達成するために構築されます。
何も目的を持たない雑に作ったコードが持つ意味は軽くなると思いませんか?

どんな簡単なものでも先にあげたように目的を明確にし、達成できるようにすると自然と”考える”癖がつきます。

1つの目的地に行くための手段は1つでしょうか?考えてみてください。

”「Hello,World」と画面出力しなさい”という課題の答えは1つでしょうか?考えてみてください。

自身で考え(時に設計し)、実現できる力を養ってください。

ここでどれだけの手段が思いつくかで、現在の自身の実力が分かります。


もしここで”「Hello,World」の出力方法 複数”というキーワードで検索しに行こうしていたらプログラミングには向いてないかもしれません。

追記

この手の質問者に参考にしてほしい質問とその回答

投稿2020/06/16 12:15

編集2020/06/16 12:17
m.ts10806

総合スコア80875

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

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

nedekee

2020/06/17 02:19

m.ts様 解決済みの質問にも関わらず、とっっっっっても為になるお話を有り難う御座います! 具体性を示せとはリアルでも常に言われていました。「こそあどを使うな」とか。 拙僧の申し上げた「綺麗」の目指すところして -psrに則った整合性のあるコード -リーダブルコードやPG3原則に習った無駄のないコード まずは上記を目指したいところであります。が、 まず動かなければ、というのは痛い所を 突かれた感じです。丁度仕事での納期とリファクタリングを天秤にかけられず 頓挫や納期超えという経験を多数してきていました。 「考えてから対応する」よりも「考えながらまずコーディングして」をした結果、別の部分を何も「考えていない」ので仰るようにバグの温床になる事も 数知れず。 「Hello, World」の出力の答えと聞いて、興味本位でコンテストサイトを見た時に 1つの出力にこれだけのパターンがあるんだと驚愕した記憶があります。 頂いたご意見と類似の質問も参考に 目的の細分化、目的地(ゴール)から逆算した道順を意識していきます。 お考え糧にします、本当に有り難う御座います。
m.ts10806

2020/06/17 03:45

え、実務経験アリですか。失礼ながらそれは思えなかった。
guest

0

プログラムとは、ギリシャ語が起源で「前もって書いてあるもの」を意味します(ロングマン英英辞典より)。何が前もって書いてある、何を前もって書くのでしょうか。コンピュータが、何を、どのように計算して、どの様な結果を出すか、です。
漠然と「プログラム」とか「ロジック」と外来カタカナ言葉を使うのではなく、仮名漢字の日本語で表現した方が理解しやすいのではないかと思います。
プログラムは、コンピュータに対する指示書です。いつ、何処にある、何を、どうするかを指示します。報告書を書くときの5W1Hと同じです。人に説明するのか、コンピュータに説明するのか、その違いだけです。

投稿2020/06/16 12:51

Q71

総合スコア995

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

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

nedekee

2020/06/17 02:33

Q71様 解決済みの質問にも関わらず、有り難う御座います。 起源のお話興味あります。 インタプリタ言語しか触れた事が無いからか、コンピューター側に立った 考え方というのはあまりした事が無かったです。 覚える楽しみは有れど、この業界略称や横文字が多すぎるなというのは感じます。 名称と日本語の正しい説明をセットで覚える事で、曖昧な理解を避けていきます。
guest

0

沢山のご回答有り難う御座いました。
ソースに関してはファイルではなくPDOを使ってデータベースに保存する事と致しました。
こちらについては一旦締め切らせて頂きます。
ロジックという面でサイトや考え方をご提示いただいたhentaiman様を
BAとさせて頂きます。
皆様も貴重なご意見有り難う御座いました!

投稿2020/06/16 11:48

nedekee

総合スコア4

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問