derasado
@derasado (Sado)

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

登録した複数のメモを表示したい

Q&A

Closed

解決したいこと

ここに解決したい内容を記載してください。
メモとTodoアプリ機能がついたWEBアプリをテキストバージョンをまず作成しております。
コードで分かるように、登録した複数のメモを表示したいのですが、アプリケーションが終了して処理から抜けてしまいます。
メモの登録は繰り返し登録できるようにできたのですが、それからメモの表示がうまくできません。

解決方法を教えて頂けますと幸いです。
また、初心者で練習中なのでコードを見てもっといいやり方などあれば
気になった点などあればご教授頂けると幸いです。

・MEMO MENU分岐の部分です。

宜しくお願い致します。

発生している問題・エラー

出ているエラーメッセージを入力

例)

NameError (uninitialized constant World)

または、問題・エラーが起きている画像をここにドラッグアンドドロップ

該当するソースコード

PHP
<?php

function memoMenuChoice() {
    echo 'MEMO MENU' . PHP_EOL;
    echo '1. メモを登録' . PHP_EOL;
    echo '2. メモリストを表示' . PHP_EOL;
    echo '3. ToDoリストへ' . PHP_EOL;
    echo '9. アプリケーションを終了' . PHP_EOL;
    echo '番号を選択してください(1,2,3,9):';
    return trim(fgets(STDIN));
}

function todoListChoice() {
    echo 'ToDo MENU' . PHP_EOL;
    echo '1. やることを登録' . PHP_EOL;
    echo '2. やることリストを表示' . PHP_EOL;
    echo '3. MEMOリストへ' . PHP_EOL;
    echo '9. アプリケーションを終了' . PHP_EOL;
    echo '番号を選択してください(1,2,3,,9):';
    return trim(fgets(STDIN));
}

function registerMemo() {
    echo 'MEMOを登録してください。' . PHP_EOL;
    echo '1. メモのタイトル:';
    $memoTitle = trim(fgets(STDIN));
    echo '2. メモの詳細:';
    $memoBody = trim(fgets(STDIN));
    echo 'メモの登録が完了しました。' . PHP_EOL;
    return [
        'memoTitle' => $memoTitle,
        'memoBody' => $memoBody,
    ];
}

function memoListDisplay($memoListChoices) {
    foreach ($memoListChoices as $memoListChoice) {
        //メモのリスト表示
        echo '登録済みのMEMOを表示します:'. $memoListChoice['memoTitle'] . PHP_EOL;
        echo '1. メモのタイトル:' . $memoListChoice['memoBody'] . PHP_EOL;
        echo '2. メモの詳細:' . PHP_EOL;
        echo '----------' . PHP_EOL;   
    }
}

function registerToDo() {
    echo 'やることを登録してください。' . PHP_EOL;
    echo '1. やることのタイトル:';
    $todoTitle = trim(fgets(STDIN));
    echo '2. やることの詳細:';
    $todoBody = trim(fgets(STDIN));
    echo 'やることの登録が完了しました。' . PHP_EOL;
}

function toDoListDisplay() {
    echo '登録済みのやることリストを表示します。' . PHP_EOL;
    //ここの下に配列使って登録したTODO表示。
    echo '1. やることのタイトル:' . PHP_EOL;
    echo '2. やることの詳細:' . PHP_EOL;
    echo '----------' . PHP_EOL;
}

echo '-TOP MENU-' . PHP_EOL;
echo '1. メモを使う' . PHP_EOL;
echo '2. Todoを使う' . PHP_EOL;
echo '9. アプリケーションを終了' . PHP_EOL;
echo '番号を選択してください(1,2,9):';
$topMenuChoice = trim(fgets(STDIN));

$todoListChoice = null;
$memoListChoice = null;
$memoListChoices = [];


    //TOPMENUの分岐
    if ('1' == $topMenuChoice || '1' == $topMenuChoice) {
        $memoListChoice = memoMenuChoice();
    } elseif ('2' === $topMenuChoice || '2' === $topMenuChoice) {
        $todoListChoice = todoListChoice();
    } elseif ('9' || '9' === $topMenuChoice) {
        //アプリケーションを終了
    }

//MEMO MENUの分岐
while ('1' === $memoListChoice || '1' === $memoListChoice) {
    if ('1' == $memoListChoice || '1' == $memoListChoice) {
        // while ('1' === $memoListChoice || '1' === $memoListChoice) {
            $memoListChoices[] = registerMemo();
            $memoListChoice = memoMenuChoice();  //ここで2の表示に移りたいが選択すると処理が終わってしまう。
        // }
    } elseif ('2' == $memoListChoice || '2' == $memoListChoice) {
        memoListDisplay($memoListChoices);
        $memoListChoice = memoMenuChoice();
    } elseif ('3' == $memoListChoice || '3' == $memoListChoice) {
        $todoListChoice = todoListChoice();
    } elseif ('9' == $memoListChoice || '9' == $memoListChoice) {
        //アプリケーションを終了
    }
}
    
    //TODO MENUの分岐
    if ('1' == $todoListChoice || '1' == $todoListChoice) {
        registerToDo();
    } elseif ('2' == $todoListChoice || '2' == $todoListChoice) {
        toDoListDisplay();
    } elseif ('3' == $todoListChoice || '3' == $todoListChoice) {
        memoMenuChoice();
    } elseif ('9' == $todoListChoice || '9' == $todoListChoice) {
        //アプリケーションを終了
    }


自分で試したこと

何パターン化試しましたが、イメージがでてきません。

0

4Answer

回答 ループの条件式を見直してみましょう

whileの使い方がおかしい気がします。
ループの命令文なので条件が一致する場合にループします。

while ('1' === $memoListChoice || '1' === $memoListChoice) {

$memoListChoiceが1の場合は繰り返せとしているので、

 $memoListChoice = memoMenuChoice();  //ここで2の表示に移りたいが選択すると処理が終わってしまう。

2を選択して$memoListChoiceに代入すると、ループの条件から外れて処理が終わります。

だいぶ見づらくなってきたので設計の見直しが必要かなと思います。
WEBアプリとこのことですので、表示画面が必要になりますよね?

html、css、javascriptを取り入れて、
画面表示用のコードを別にするだけでも読みやすくなるかなと。

その際trim(fgets(STDIN))はまともに動かせないのでご注意ください。
フロントサイドだと<input>に入力からのsubmitでデータ送信が一般的です。

頑張れば全部phpで実装することもできるのかもしれませんが、まずやらないです。
html、css、javascriptこれらをphpに記述しても動きますが、一般的にはファイルを分けます。

ということで、次の段階に進んでみませんか?

ps
本音としては、
そろそろ読むの辛いので、再設計をお願いしたいです。
処理を追うのが大変で回答する時間が取れなくなっちゃう。

1Like

ご回答いただきましてありがとうございます。

"1" => "メモを登録", "2" => "メモリストを表示" などのように、連想配列(ハッシュ)を活用されると、
表示用の似たような関数をいくつも用意せずに済むでしょうかとのことですが、具体的には各項目を関数内で配列に代入してから戻り値として返すということでしょうか?

②if else よりは、switch case で書いた方が、コードが見やすいかと思います。
ありがとうございます。switch caseで試してみます!

③関数get_menu_number() 入れてみます!

④入力されたメモは配列に格納しております。まだオブジェクト指向やDBの知識が身についてない状況でして、やはり現在の知識ではこの変が限界なのでしょうかね?

0Like

amiya-seさん
度々のご回答にお時間を頂きましてありがとうございます。

学んだことをアウトプットする過程でPHPのみで行っておりましたが
現在作ろうとしているものに対して、amiya-seさんのご回答でPHPのみでは難しいことに気付きました!

またインプットの段階に進もうと思います。
色々とご教授ありがとうございます。

お忙しいところこのような煩雑なコードを読んで頂いてありがとうございます:cold_sweat:

0Like

Atelier-Miraiさん
ご回答いただきましてありがとうございます。

whileとswitchの活用で、遷移図のようなことが出来るのですね!とても勉強になりました。

とても分かりやすいかつ、今後の道筋なども記して頂きました!とても励みになるお言葉もありがとうございます:relaxed:
フォローさせて頂きましたので、またなにかあればお願い致します!

0Like

Your answer might help someone💌