derasado
@derasado (Sado)

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

PHPの配列と関数・変数の関係についておしえてください。

Q&A

Closed

解決したいこと

ここに解決したい内容を記載してください。

PHPの配列と関数、変数の関係についておしえてください。
下のコードで
・ifの戻り値の $comments[]
・変数で代入した $comments = []
・関数の引数とelseifの戻り値で使用している $comments

この3つの関係がよくわかりません。
・変数で使用している、$comments = [] は代入すると$comments[]だと思うのですが、なぜ関数で引数と戻り値で使用する際に、[]が入っていないのか?
・なぜifの戻り値に関しては、[]がついているのか?
・ここで変数はどのようなときに使用されているのか?

上記疑問点がありまして、教えて頂けると幸いです。

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

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

例)


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

該当するソースコード

PHP

例)

<?php

function bookRegister()
{
    echo '読書ログを登録して下さい' . PHP_EOL;
    echo '書籍名:';
    $bookTitle = trim(fgets(STDIN));
    echo '著者名:';
    $name = trim(fgets(STDIN));
    echo '読書状況(未読,読んでる,読了):';
    $status = trim(fgets(STDIN));
    echo '評価(5点満点の整数):';
    $review = trim(fgets(STDIN));
    echo '感想:';
    $impressions = trim(fgets(STDIN));

    echo '登録が完了しました' . PHP_EOL  . PHP_EOL;
    return [
        'bookTitle' => $bookTitle,
        'name' => $name,
        'status' => $status,
        'review' => $review,
        'impressions' => $impressions,
    ];
}

function bookDisplay($comments) //ここの引数は$何故comments[]ではないのか
{
    echo '登録済の読書ログを表示します' . PHP_EOL;

    foreach ($comments as $comment) {
        echo  '書籍名:' . $comment['bookTitle'] . PHP_EOL;
        echo  '著者名:' . $comment['name'] . PHP_EOL;
        echo  '読書状況:' . $comment['status'] . PHP_EOL;
        echo  '評価:' . $comment['review'] . PHP_EOL;
        echo  '感想:' . $comment['impressions'] . PHP_EOL;
        echo '---------------' . PHP_EOL;
    }
}

$comments = []; //空の配列を代入すると→$comments[]になる認識


while (true) {
    echo '1. 読書ログを登録' . PHP_EOL;
    echo '2. 読書ログを表示' . PHP_EOL;
    echo '9. アプリケーションを終了' . PHP_EOL;
    echo '番号を選択してください (1,2,9) :';
    $num = trim(fgets(STDIN));

if ($num === '1' || $num === '1') {
    $comments[] = bookRegister(); //ここの$commentsは上の$comments = [] の変数を使っている認識

} elseif ($num ==='2' || $num === '2') {
    bookDisplay($comments); //なぜここの$comments$comments[]ではないのか?
} elseif ($num ==='9' || $num === '9') {
    break;
}
    }

自分で試したこと

ここに問題・エラーに対して試したことを記載してください。
関数で引数に[]を入れたらエラーになりました。

0

2Answer

結論としては、$array[]のような書き方は、配列の最後に値を追加したい時に使用します。

連想配列ではない普通の配列の場合、0から始まる添字(index)に値が入るのですが、
$array[] = 'a'のように添字なしに値を入れようとした場合、配列の最後に追加されます。

$array = [];
$array[] = 'a';
$array[] = 'b';

var_dump($array); // ['a', 'b']

つまり$comments[] = bookRegister();という処理は
$commentsという配列の最後にbookRegister()の返り値を追加している、
という意味になります。

空の配列を代入すると→$comments[]になる認識

$comments = []$commentsは空の配列になりますが、
$comments[]は「配列の最後に値を追加」する時に使うので意味合いが違います。

なぜここの$commentsは$comments[]ではないのか?

配列そのものをセットしたい場合は$commentsで問題ないです。
配列の中の特定の要素を指定したい場合は$comments[1]のように添え字を指定します。

1Like

Comments

  1. @derasado

    Questioner

    理解できました!!
    ご丁寧にありがとうございます!

回答 配列=箱、変数の添え字について学ぶと理解が深まるかもです。

読んだ本の記録を残すプログラムかな。
順番に解説しますね。

$comments = [];

これは$commentsという変数を配列にする記述です。
[]これは箱を作ってるとイメージしてみてください。
コメントを入れる箱を作っているんです。

$commentsこれは箱全体を表しています。

$comments[数字][]に数字を入れると箱の中の「数字」番目を見てくれます。
※添え字と言います。

$comments[] = bookRegister();

これはbookRegister関数で作成したデータを、
$commentsの箱の中へ順番を指定せずにポイっと突っ込むという記述になります。
[]に数字を入れないと一番上に積み重なります。


function bookDisplay($comments)

bookDisplay($comments);

bookDisplay関数の引数に[]を付けない理由は、
$commentsという箱全体を広げて「すべてのコメントを取得したいから」です。

参考URL PHP公式
https://www.php.net/manual/ja/language.types.array.php

1Like

Comments

  1. @derasado

    Questioner

    すみません、プログラムの概要を忘れておりました!

    ご回答いただきましたおかげで、理解できました!!
    ご丁寧にありがとうございます!

Your answer might help someone💌