今回のネックは、
戻るボタンを2回以上押して、他のページに飛び、 また、戻るボタンを押した時のページ遷移先を表現すること
上記の問題を解決するのに、配列を2つ用意した。
イメージ:末尾が現在地 1回目: $result = [1, 2, 3, 4, 5, 6] $result2 = [1, 2, 3, 4, 5, 6] <- 末尾を削除する配列 戻るボタンを押した! $result = [1, 2, 3, 4, 5, 6, 5] $result2 = [1, 2, 3, 4, 5] 2回目: $result = [1, 2, 3, 4, 5, 6, 5, 7] $result2 = [1, 2, 3, 4, 5, 7] 戻るボタンを押した! $result = [1, 2, 3, 4, 5, 6, 5, 7, 5] $result2 = [1, 2, 3, 4, 5] 戻るボタンを押した! $result = [1, 2, 3, 4, 5, 6, 5, 7, 5, 4] $result2 = [1, 2, 3, 4] 3回目: $result = [1, 2, 3, 4, 5, 6, 5, 7, 5, 4, 8] $result2 = [1, 2, 3, 4, 8]
配列を2つ用意して、2つともページ遷移後のページ名を格納する。 ただし、1つの配列は、use the back button(戻るボタンのクリック) 時、末尾の値を削除する。 そして、その配列の新しい最後の値を別の配列の末尾に追加する(前のページに戻る)。 */ $n = (int) trim(fgets(STDIN)); // 全てのクエリを持つ配列。$queryArr $queryArr = []; // 答えになる、ページ名を格納していく、配列。初期値は、'blank page'になる。 $resultArr = ['blank page']; // こちらの配列は、back btn がでてきたら、最後の要素を削除する。 $resultArr2 = ['blank page']; // $n === 1 なら、即終了。 if ($n === 1) { echo 'blank page'; die(); } for ($i = 0; $i < $n; $i++) { $queryArr[] = trim(fgets(STDIN)); } // $n === 2 の時も、すぐに回答が作れる. if ($n === 2) { $secondePage = 1; $secondePageName = judgePageName($queryArr, $secondePage); echo 'blank page' . PHP_EOL; echo $secondePageName; die(); } // 作業回数を数えとく、変数 $count を作る。 // 初期値が固定値であり、2つめのクエリが、必ず、blank page 以外のページになるため // $count = 1から始める。$count === $n - 1 になったら、終了。 $count = 1; // 1つ前のページに戻るか判断する for($i = $count; $i < $n; $i++) { if (reset(explode(' ', $queryArr[$i])) === 'use') { array_pop($resultArr2); // 1つ前のページ名を$resultArr に格納する $resultArr[] = end($resultArr2); $count++; } else { $pageName = judgePageName($queryArr, $i); $resultArr[] = $pageName; $resultArr2[] = $pageName; $count++; } } function judgePageName(array $queryArr, int $count): string { // 3つ目の要素以降を取得する。それが、ページ名になる $startIndex = 2; $slicedArr = array_slice(explode(' ', $queryArr[$count]), $startIndex); $pageName = implode(' ', $slicedArr); return $pageName; } foreach ($resultArr as $v) { echo $v . PHP_EOL; }
reset() :配列の最初の値を取り出す関数。
p.s. クラスを使っていきたい。クラスの基本的な動作を理解したが、操作できるレベルに到達したい。。