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

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

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

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

コードレビュー

コードレビューは、ソフトウェア開発の一工程で、 ソースコードの検査を行い、開発工程で見過ごされた誤りを検出する事で、 ソフトウェア品質を高めるためのものです。

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

Q&A

解決済

2回答

1089閲覧

プログラムの読解:仕組みを理解したい。

xxx0_0xxx

総合スコア9

PHP

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

コードレビュー

コードレビューは、ソフトウェア開発の一工程で、 ソースコードの検査を行い、開発工程で見過ごされた誤りを検出する事で、 ソフトウェア品質を高めるためのものです。

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

0グッド

1クリップ

投稿2021/07/14 02:06

編集2021/07/14 05:26

パスカルの三角形のプログラムを実装します。
その際に、参考サイトを発見したのですが、
仕組みがいまいちわからない点があるため質問させていただきます。

ここで行なっていることがいまいちわかりません。
御教授がいます。

// $rowsがnullかどうか判断し、nullであれば[]を表示 $previousRow = $rows[$i - 1] ?? []; $previousSize = count($previousRow);
$rows = [];       for ($i = 0; $i < $hoge; $i++) { $row = [1]; $previousRow = $rows[$i - 1] ?? []; $previousSize = count($previousRow); for ($j = 1; $j <= $previousSize; $j++) { if ($j === $previousSize) { $row[] = 1; continue; } $row[] = ($previousRow[$j - 1] + $previousRow[$j]); } $rows[] = $row; } return $rows;

参考サイト:https://exercism.io/tracks/php/exercises/pascals-triangle/solutions/a2d37bbedcc745a897d892dca86a3c34

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

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

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

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

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

m.ts10806

2021/07/14 02:22

その参考サイトとは? ご自身はどこまで調べて理解されてるのでしょうか。 なにかこう、どこが分からないのか見えづらい書き方になってます。
xxx0_0xxx

2021/07/14 02:33

ご指摘ありがとうございます、参考サイト追記いたしました。 ?? []; この部分の仕組みがわからなかったので、調べたところNullかどうか確認できるnull合体演算子であることがわかりました。 しかし以降の仕組みがわからないので質問しました
m.ts10806

2021/07/14 02:35

null合体演算子により何が得られるかは質問者さんは分かってそうに感じたのですが、いかがでしょうか。 [] は空の配列なので、count()しても0でその場合は次のforは処理されず、あたりの話ですか?
xxx0_0xxx

2021/07/14 02:58

この場合は [ ] を得るという考えであっていますか? 詳細不足ですみませんm(__)m $rows[$i - 1] この部分の仕組みがわからない状況です。
xxx0_0xxx

2021/07/14 05:25

ご丁寧にURLまでありがとうございます! $previousRow = $rows[$i - 1] ?? []; $previousSize = count($previousRow); つまりここでは、$previousRowをカウントした値を$previousSize としているのですよね? すみません何だか全体的に何をしているのかわからなくなってきてしまいましたm(__)m 全体的に説明いただきたいです。
m.ts10806

2021/07/14 05:39

このように書いた意図は作った人にしか分かりませんし、先に書いたように手元で動かして一行ずつ追っていくしかありません。デバッグを覚えてください。 ここで赤の他人が書いたコードを赤の他人が解読しても質問者さんからすると更に第三者感が強くなるので「理解したい」という本質問の目的は達成できないと思います。 使いたい/コードを参考にして何かしたい のはあくまで質問者さんですから。
guest

回答2

0

$rowsがnullかどうか判断し、nullであれば[]を表示

表示はしません。代入しているだけです。

前の行の配列分を$previousSizeとする

「配列分」とは何でしょうか?

投稿2021/07/14 02:34

maisumakun

総合スコア146018

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

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

xxx0_0xxx

2021/07/14 03:02

表示はしません。代入しているだけです。 > なるほど!だから出力で[ ]を表示してくれているわけですね。 「配列分」とは何でしょうか? > すみません明らかにミスです。 $previousRow = $rows[$i - 1] ?? []; ここで得られたカウント数という意味です。
guest

0

ベストアンサー

私は提示のコードを作った人ではなく、恥ずかしながら「パスカルの三角形」自体言葉にピンときてなくて調べて「あぁこのことか」となる程度なので合ってるか分かりませんが、コード読む限りでヒントになりそうなことをざっくりと書いてみます。


$rowsは空の配列のままで最初のループに入るので、一周目は「前のデータ($i-1というのとpreviousという名前から判断)」というのは存在しません。
そのために参照可能かどうか判断し、状況に応じて「前の行」を定義しているのだと思います。
で、前の行の件数だけ中のループを行い、計算した結果を保持していく。
中のループを抜ける条件も前の行の内容により判定。
みたいな感じで。

デバッグでステップ実行し、変数が保持する情報がどうなっていくか追ってみてください。どの言語でもデバッグは必須スキルです。
特に他人が書いたコードを理解したいのでしたら、全体要件を以て手元でステップ単位で理解していくしかありません。

投稿2021/07/14 05:53

m.ts10806

総合スコア80875

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

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

xxx0_0xxx

2021/07/15 04:58 編集

大変わかりやすくありがとうございます! デバッグで色々と変数を出力してみましたが、 なぜこの結果が出るのかがわからずにいます・・・。 お手数ですが再度ご協力願いたいです。 for ($j = 1; $j <= $previousSize; $j++) { // $j = if ($j === $previousSize) { $row[] = 1; continue; } var_dump ($previousSize);// 行のデータ分を1-9までで表示 $row[] = ($previousRow[$j - 1] + $previousRow[$j]); // 右端(1)だけ除外した行のデータ } // 最終的な出力結果 $rows[] = $row; } return $rows; // 右端だけ除外した行のデータ $hogeを5として$j を出力したところ int(1) int(1) int(2) int(1) int(2) int(3) int(1) int(2) int(3) int(4) と表示されました。 ここがなぜこの結果になるのか・・・ いくら考えてもわからなくて> <
m.ts10806

2021/07/15 04:57

なので「ステップ実行」とキーワードを出しました。 変数を一つだけ出したとしても分かることはあまりなくて、一行一行関係する変数の変化を追うことになります。 var_dumpを入れていくのも一つの手ですが、それでは一気に出てしまうので、XDebugなどライブラリを入れるか、IDEのブレイクポイントの機能を使ってください。
xxx0_0xxx

2021/07/15 05:02

VSCodeを利用しているのですが、現在デバッグが使えない状況です。 そのためこのように一つ一つ出力している形です><
m.ts10806

2021/07/15 05:09

拡張機能あるようですので、使えないという理由が分かりません。 デバッグ導入も初期の環境構築のうちです。がんばってください。
xxx0_0xxx

2021/07/15 05:13

何度もありがとうございました! 構築再度行なってみます。
m.ts10806

2021/07/15 06:22

解決は良いのですが、「仕組みを理解したい」という命題に対する解はどうなったのでしょう。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問