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

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

ただいまの
回答率

88.61%

【PHP】array、in_arrayの使われ方について

解決済

回答 2

投稿

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

akari_sss

score 20

オライリー本のプログラミングPHPより皆様に質問です。

以下コードの結果は、フォームに入力があった場合、
「You did have all the required」

入力がなかった場合、
「You did not have all the required」
となります。

<?php

function hasRequired($array, $requiredFields){
 $array = 

 $keys = array_keys($array);
 foreach ($requiredFields as $fieldName){
  if (! in_array($fieldName,$keys )){
  return false;
  }
 }
 return true;
}
if ($_POST ['submitted']) {
 $testArray = array_filter($_POST);
 echo "<p>You ";
 echo hasRequired ($testArray, array(
   'name',
   'email_adress'
 ))? "did" : "did not";
  echo "have all the required.</p>";
}
?>

<form action ="<?php echo $_SERVER['SCRIPT_NAME']; ?>" method="POST">
 <input type="text" name="name"/>
  <input type="text" name="email_adress"/>
   <input type="text" name="age"/>
   <input type="submit" value="submit" name="submitted"/>
</form>

質問①$requiredFieldsは一体どこからやってきたのでしょうか
質問該当箇所:
function hasRequired($array, $requiredFields「ここ」)

質問②$arrayのイコール以降、何もコードが書かれていないのですが、どういう意味でしょうか。。
質問該当箇所:
function hasRequired($array, $requiredFields){
$array = 「ここ」

質問③array_filterをなぜ使っているのでしょうか。。
array_filter「ここ」($_POST);

質問④この部分のコードは何を意味しているでしょうか。。
echo hasRequired ($testArray, array(
'name',
'email_adress'
))? "did" : "did not";

質問だらけで大変申し訳ございません。。
もし、一つだけでもお分かりになる方がいらっしゃいましたら、
ご教授頂けますと幸いです。
よろしくお願い致します。

  • 気になる質問をクリップする

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 2

+2

質問①$requiredFieldsは一体どこからやってきたのでしょうか
質問④この部分のコードは何を意味しているでしょうか。。

上で定義したhasRequired関数を、下のecho hasRequired(...)で呼び出しています。引数は実際に指定された$testArrayとその場で書かれた配列が入っていきます。

質問②$arrayのイコール以降、何もコードが書かれていないのですが、どういう意味でしょうか。。

おそらく単なる間違いでしょう。文法的には、$array = $keys = array_keys($array);と同じことになって、$keysと同じものが$arrayに代入されますが、この$arrayはこれ以降で使われないので、代入しても無意味です。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2018/11/08 17:43

    お答えいただきまして、ありがとうございます!!
    ユーザーランキング一位の人にこたえて頂けてびっくりしました!
    またよろしくお願いいたします!

    キャンセル

checkベストアンサー

+1

質問①
hasRequiredメソッドの引数として2つの変数を定義しています。
なのでどこからというより「$arrayと$requiredFieldsを渡すよう(筆者が)決めた」となります。

質問②
多分筆者のミスです。この行は不要です。

質問③
array_filterは第二引数無しで使うと「配列の値がfalseになる要素を除去」という動きになります。
PHP: array_filter - Manual
$_POSTに対して使っているので、未記入な要素を除去します。
(例えば$_POST['name']=''だったら、'name'要素が$_POST配列から取り除かれる)

質問④
三項演算子?hasRequiredメソッドの組み合わせです。
hasRequiredを$array=$testArray、$requiredFields=array('name','email_adress')として実行
hasRequiredの実行結果がtrueなら"did"、falseなら"did not"をechoする
という2つの処理が1行になっていると考えれば理解頂けるでしょうか。


トータルで見ると
質問③で「POSTから未記入のものを除去」
hasRequiredで「$requiredFieldsの要素が$arrayのキーとして全て含まれていたらtrue、いなかったらfalseを返す」
質問④で「hasRequiredの結果により文言出し分け」
なので「フォームのnameとemail_adressの両方が記入されていればYou did have all the required、未記入があればYou did not have all the requiredと表示する」という挙動になります。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2018/11/08 17:40

    全部お答えいただいてありがとうございます!!
    すごくわかりやすかったです!!
    またよろしくお願いいたします!

    キャンセル

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

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

関連した質問

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