最小限度の修正で済ませるのであれば45行目を以下のように修正して下さい。
※ registerMemosは配列を要素に持つ配列になる。
//メモを登録
$registerMemos = registerMemo();
//メモを登録
$registerMemos[] = registerMemo();
ここに解決したい内容を記載してください。
PHPでエラーがでてしまいます。
恐らく連想配列?あたりがうまくいってないかと思うのですが、まったくわかりませんでした。
教えて頂けると幸いです。
出ているエラーメッセージを入力
Warning: Illegal string offset 'memoTitle' in /var/www/html/memoapp.php on line 26
1. メモのタイトル:1
[24-Feb-2021 23:23:57 Asia/Tokyo] PHP Warning: Illegal string offset 'memoBody' in /var/www/html/memoapp.php on line 27
または、問題・エラーが起きている画像をここにドラッグアンドドロップ
ソースコードを入力
例)
<?php
function topMenuChoice() {
echo 'TOP MENU' . PHP_EOL;
echo '1. メモを登録' . PHP_EOL;
echo '2. メモリストを表示' . PHP_EOL;
echo '9. アプリケーションを終了' . PHP_EOL;
echo '番号を選択してください(1,2,9):';
return trim(fgets(STDIN));
}
function registerMemo() {
echo 'MEMOを登録してください。' . PHP_EOL;
echo '1. メモのタイトル:';
$memo['memoTitle'] = trim(fgets(STDIN));
echo '2. メモの詳細:';
$memo['memoBody'] = trim(fgets(STDIN));
echo 'メモの登録が完了しました。' . PHP_EOL;
return $memo;
}
function memoListDisplay($registerMemos) {
foreach ($registerMemos as $registerMemo) {
//メモのリスト表示
echo '登録済みのMEMOを表示します:'. PHP_EOL;
echo '1. メモのタイトル:' . $registerMemo['memoTitle'] . PHP_EOL; //ここが問題?
echo '2. メモの詳細:' . $registerMemo['memoBody'] . PHP_EOL; //ここが問題?
echo '----------' . PHP_EOL;
}
return;
}
$registerMemos = [];
//MEMO MENUの分岐
while (true) {
echo '1. メモを登録' . PHP_EOL;
echo '2. メモを表示' . PHP_EOL;
echo '9. アプリケーションを終了' . PHP_EOL;
echo '番号を選択してください(1,2,9):';
$topMenuChoice = trim(fgets(STDIN));
if ('1' == $topMenuChoice || '1' == $topMenuChoice) {
//メモを登録
$registerMemos = registerMemo();
} elseif ('2' == $topMenuChoice || '2' == $topMenuChoice) {
//メモリストを表示
memoListDisplay($registerMemos);
} elseif ('9' == $topMenuChoice || '9' == $topMenuChoice) {
//アプリケーションを終了
break;
}
}
ここに問題・エラーに対して試したことを記載してください。
最小限度の修正で済ませるのであれば45行目を以下のように修正して下さい。
※ registerMemosは配列を要素に持つ配列になる。
//メモを登録
$registerMemos = registerMemo();
//メモを登録
$registerMemos[] = registerMemo();
@derasado
Questioner@derasado
Questioner追記 この回答は参考にしないようにご注意下さい。
不十分な検証と中途半端な見識に基づくものであり、
勘違いと見落としも混ざっている為、あてになりません。
憶測で物事を話してはいけませんし、飛ばし読みもいけません。
お仕事の話が来たときはそちらに集中しましょうという悪い見本です。
※「関数の返り値を連想配列で格納できていないこと」が症状の原因です※
以下 参考になりません。
追記 foreach
で$registerMemos
の中の$registerMemo
というキーを探しているけど、無いから怒られてると考えられます。そもそも関数名はregisterMemo()
だけど戻しているのは$memo
なので、異なるという…
手元の環境でphpをコマンドラインで実行できるようにしていないので憶測になりますが、
$memo
の宣言が無いのでエラー吐いている。
もしくは
$registerMemo
という宣言が無いのでエラー吐いてる。
function registerMemo() {
$ memo = [];
処理
$registerMemo = [];
return $registerMemo = [$memo['memoTitle'],$memo['memoBody']];
}
こう書いてみるか、
もしくは、
foreach ($registerMemos as $memo) {
こう書いてみるかかな。
お仕事のお話が来てしまったので、検証せずに載せてしまいます。
お手数おかけしますがフィードバックしていただけると助かります。
@derasado
Questioner@derasado
Questioner@derasado
Questioner@derasado
Questioner@derasado
Questioner$registerMemos
をvar_dump
で出力してみるとわかりますが、$registerMemos
は一次元の連想配列。
foreach ($registerMemos as $registerMemo) {
...
}
ここで一次元の連想配列の値を取り出しているため、$registerMemo
の型は文字列。
$registerMemo['memoTitle']
$registerMemo['memoBody']
文字列に対して連想配列キーによる要素アクセスを行おうとしているため、WORNING
が発生している(文字列は数値インデックスによる要素アクセスしか認められていない)。
@derasado
Questioner