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

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

ただいまの
回答率

87.34%

phpの関数の引数で見た事のない形

解決済

回答 4

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 500

score 32

phpについて
php初心者です。

以下のような関数で、引数に(array &$array, $quiz)となっているのがわかりません。
ふつうは、function func($array, $quiz)ではないですか?

function array2csv(array &$array, $quiz)
{
   if (count($array) == 0) {
     return null;
   }
   ob_start();
   $df = fopen("php://output", 'w');
   $arr_keys = ['Surname', 'First name', 'Email address', 'State', 'Started on', 'Completed', 'Time Taken', 'Grade/10.00'];

   // csvに$arr_keysを書き込む
   fputcsv($df, $arr_keys);

   // $arrayはどこから?
   foreach ($array as $row) {
      $outrow['Surname'] = $row->lastname;
      $outrow['First name'] = $row->firstname;
      $outrow['Email address'] = $row->email;
      $outrow['State'] = $row->state;
      $outrow['Started on'] = date('Y/m/d G:i', $row->timestart);
      $outrow['Completed'] = date('Y/m/d G:i', $row->timefinish);
      $outrow['Time Taken'] = $row->duration;
      $outrow['Grade'] = quiz_rescale_grade($row->sumgrades, $quiz);
      if($outrow['Grade'] == "未評定") {
          $outrow['Grade'] = "";
      }
      fputcsv($df, $outrow);
   }

   fclose($df);
   return ob_get_clean();
}
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • m.ts10806

    2019/10/03 10:25

    「ふつう」というのが何と比較しているのか分かりません。
    構文上問題ないのでこれはこれで「ふつう」です。

    キャンセル

  • ryu0311

    2019/10/03 10:26

    引数の中の、array &に何らかの意味があるなら、それを知りたいと思いまして...

    キャンセル

  • m.ts10806

    2019/10/03 10:26

    あと、処理には流れがあるのでこれだけ提示されても応えようがありません。この関数がどのように使われるのか、流れがわかるようなコード全体をご提示ください

    また「初心者」自体は要件ではありませんので、質問内に書くのではなく「初心者アイコン」をつけるにとどめてもらえたらと。

    キャンセル

  • m.ts10806

    2019/10/03 10:28

    >array &に何らかの意味があるなら、それを知りたいと思いまして...

    赤の他人ですので書かれていないことを汲み取ることはできません。
    質問内にきちんと記述願います

    キャンセル

回答 4

+2

もう一個の方を回答しますw

型宣言

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/10/03 10:40 編集

    役割、意味的には参照渡しより大事ですね。

    キャンセル

checkベストアンサー

+1

以下のような関数で、引数に(array &$array, $quiz)となっているのがわかりません。

よくある関数の引数だと、おっしゃるとおり
($array, $quiz)
だと思います。

  • 頭に array と書かれている理由
    引数の型宣言(PHP5系だとタイプヒンディング。配列の場合はPHP5.1~)です。
    この$arrayという変数には、必ずarray型の値を渡してください(それ以外はエラー)となります。
    ※型宣言という機能はPHP7.0からできた新しい機能です。

  • 変数の頭に & が付いている理由
    引数の参照渡しです。
    & が書かれていない場合は、引数は基本的に値渡しになっています(ただし、オブジェクトはデフォルトでも参照渡しですのでご注意ください)。
    →オブジェクトの場合のデフォルトは「オブジェクトIDの値渡し」だそうです。
    本回答のte2jiさんのコメントに、参考になるリンクがありますので、詳細はそちらをご覧ください。

オブジェクトの場合の挙動はちょっとややこしいので、それ以外について……という但し書き付きになりますが、値渡しと参照渡しの違いは、その関数内で変数の中身を変更した時に、呼出し元の変数の値が変わるかどうか、です。

function setHoge($a) {
    $a = 'hoge';
}

function setFuga(&$a) {
    $a = 'fuga';
}

$str = 'Hello World';
echo $str; // Hello World
echo "\n";

setHoge($str);
echo $str; // Hello World(値渡しされた引数の中身が変更された=呼出し元の変数には影響なし)
echo "\n";

setFuga($str);
echo $str; // fuga(参照渡しされた引数の中身が変更された=呼出し元の変数の値も変わる)
echo "\n";

というわけで、まとめると array &$array は「array型の値しか渡せなくて、関数内で値を書き換えると呼出し元の変数の値も変わる」ということになります。

いずれも、PHPマニュアルの「関数の引数」ページに記載されておりますので、詳細はそちらをご覧ください(それぞれ「引数の参照渡し」「型宣言」という項に書かれています)
https://www.php.net/manual/ja/functions.arguments.php

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/10/03 12:35 編集

    >te2jiさん
    ご指摘ありがとうございます。

    > array は PHP 5.1.0 以降かと

    型宣言はPHP7からの機能なので、「PHP7からの~」という説明は「型宣言」という言葉にかかっています。
    # PHP7系は「型宣言」、PHP5系は「タイプヒンディング」という別概念になっているので。できることはほぼ一緒ですが、エラーが違ったり、微妙な相違点が……。
    なお、ご指摘いただいた「array」のタイプヒンディングについては「PHP5.4以降でも似たようなことが……」のところでフォローしたつもりでした(配列のみ5.1からサポート、というのは認識していなかったので、バージョン番号はずれていますが……そちらは修正しておきます)。

    > オブジェクトを渡したときの挙動が上記では説明できません。

    すみません、オブジェクトのみデフォルトで参照渡しになっているのを失念しておりました……。
    回答修正しておきます。

    キャンセル

  • 2019/10/03 12:52

    通常の引数としてのオブジェクトは、「オブジェクトIDの値渡し」です。(ややこしいw)
    挙動としては参照渡しに近い気がしますが、オブジェクトの参照渡しは別の挙動をします。

    私もいつもわからなくなるので、「参照渡し」という言葉の使用そのものを避けるのですが、
    https://qiita.com/tDash/items/88e0e11a0247151f32c9
    のコメント欄がわかりやすいです。

    キャンセル

  • 2019/10/03 14:01

    わかりやすいページのご紹介ありがとうございます!

    オブジェクトIDの値渡しと参照渡し、ほぼ同じものだと思っておりました(参照渡し=「アドレスをコピーして同じ実体を参照するもの」だとばかり……)。お恥ずかしい限りです。
    ひとさまに説明させていただく時は、きちんと裏を取ってからにしないといけませんね。

    キャンセル

+1

リファレンス渡し、または参照渡し 
です。

PHPマニュアルにも解説はありますが、色々コードを書いて動かして情報の変化をデバッグで見ていったほうが理解に繋がります。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

+1

質問のような構文に関する疑問は、マニュアルを見れば記載されています。
PHP - マニュアル - 言語リファレンス - 関数 - 関数の引数 - 引数の参照渡し

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 87.34%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る