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

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

新規登録して質問してみよう
ただいま回答率
85.48%
PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

3回答

648閲覧

PHPの関数ないで配列でが取り出せな

Chandler_Bing

総合スコア673

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

1グッド

1クリップ

投稿2019/02/19 17:59

このPHPファイルはリターンで返したい配列($mouths)を関数内でフィールドに宣言されている変数($results)に格納し、リターンするgetMouths()メソッドがあります。この配列は$currentpageと$itemperpageで返す配列を制限します。($currentpagが1,$itemperpagが5の場合はインデックスが0から4の配列を返す)

php

1<?php 2$results = array(); 3$mouths = array( 4 array('hotel_id' => '1', 'title'=>'気に入りました', 'date'=>'2016/09/21', 'number'=>'8', 'word'=>'非常に満足', 'name'=>'Chandler', 'country'=>'JPN', 'text'=>'レビューが良かったので気になってたホテル。初めて泊まりましたが常宿決定。 新館に泊まりましたが、価格に対して部屋の広さ、設備が良い。周りに日本食屋が多い。隣りの焼肉屋がとても美味しかった。 ホテルのマッサージも良かった。 5 アヤラモールもタクシーですぐだし、銀行も徒歩圏内。旅行会社も並びにあるみたいで翌日のボホール島のチケットも買えるらしい。とにかく便利で部屋も満足。熱いシャワーも出る。'), 6 7 array('hotel_id' => '1', 'title'=>'ロケーション良い', 'date'=>'2016/10/21', 'number'=>'9', 'word'=>'満足', 'name'=>'Chandler', 'country'=>'JPN', 'text'=>'レビューが良かったので気になってたホテル。初めて泊まりましたが常宿決定。 新館に泊まりましたが、価格に対して部屋の広さ、設備が良い。周りに日本食屋が多い。隣りの焼肉屋がとても美味しかった。 ホテルのマッサージも良かった。 8 アヤラモールもタクシーですぐだし、銀行も徒歩圏内。旅行会社も並びにあるみたいで翌日のボホール島のチケットも買えるらしい。とにかく便利で部屋も満足。熱いシャワーも出る。'), 9 10 array('hotel_id' => '1', 'title'=>'セブでベスト', 'date'=>'2016/10/23', 'number'=>'8', 'word'=>'満足', 'name'=>'Chandler', 'country'=>'JPN', 'text'=>'この値段でこのクオリティは素晴らしい。広さを除けば、部屋のグレードはマルコポーロ・ホテルと遜色ありません。 11 立地もよく便利なホテルです。前面道路の騒音だけがマイナスポイント。おススメです。'), 12 13 array('hotel_id' => '1', 'title'=>'good hotel', 'date'=>'2018/10/03', 'number'=>'8', 'word'=>'非常に満足', 'name'=>'Chandler', 'country'=>'JPN', 'text'=>'動きやすい場所にあり、知名度もありホテルに帰るのが楽。部屋はリノベーションされてて綺麗で居心地よい。 14 近くにあるタイのスパはオススメです。前回に続き二度目の利用ですが、次回もここかな。'), 15 16 array('hotel_id' => '1', 'title'=>'評判通りの良いホテル”', 'date'=>'2019/01/03', 'number'=>'8', 'word'=>'満足', 'name'=>'Chandler', 'country'=>'JPN', 'text'=>'評判通りの良いホテル'), 17 18 array('hotel_id' => '1', 'title'=>'良いホテル”', 'date'=>'2016/01/23', 'number'=>'8', 'word'=>'非常に満足', 'name'=>'Chandler', 'country'=>'JPN', 'text'=>'また行きたいと思います'), 19 20 array('hotel_id' => '1', 'title'=>'便利なロケーション', 'date'=>'2017/08/07', 'number'=>'8', 'word'=>'非常に満足', 'name'=>'Chandler', 'country'=>'JPN', 'text'=>'セブに滞在の際利用しますが、交通の利便性、立地環境などがいいとおもいます。 21 価格に対するパフォーマンスもgood!です。'), 22 23 array('hotel_id' => '1', 'title'=>'また行きます', 'date'=>'2018/09/07', 'number'=>'8', 'word'=>'最高', 'name'=>'Chandler', 'country'=>'JPN', 'text'=>'1日の滞在でしたが、立地も分かりやすく、目の前のジャズバーももあり、いい環境でした。 24 部屋のグレードも値段の割には申し分なしです。次回も滞在'), 25 26 array('hotel_id' => '1', 'title'=>'また行きます', 'date'=>'2018/09/07', 'number'=>'8', 'word'=>'満足', 'name'=>'Chandler', 'country'=>'JPN', 'text'=>'1日の滞在でしたが、立地も分かりやすく、目の前のジャズバーももあり、いい環境でした。 27 部屋のグレードも値段の割には申し分なしです。次回も滞在'), 28 29 array('hotel_id' => '1', 'title'=>'wifiが無料', 'date'=>'2018/11/07', 'number'=>'8', 'word'=>'非常に満足', 'name'=>'Chandler', 'country'=>'JPN', 'text'=>'タクシーの運転手で知らない人がいなかったので、便利だった 30 wifiが無料で普通に使えたこの値段からしたらかなりいいと思う横の焼肉屋がうまい タン塩が最高スタッフの愛想が良かった'), 31 32 array('hotel_id' => '1', 'title'=>'気に入りました', 'date'=>'2016/09/21', 'number'=>'8', 'word'=>'非常に満足', 'name'=>'Chandler', 'country'=>'JPN', 'text'=>'レビューが良かったので気になってたホテル。初めて泊まりましたが常宿決定。 新館に泊まりましたが、価格に対して部屋の広さ、設備が良い。周りに日本食屋が多い。隣りの焼肉屋がとても美味しかった。 ホテルのマッサージも良かった。 33 アヤラモールもタクシーですぐだし、銀行も徒歩圏内。旅行会社も並びにあるみたいで翌日のボホール島のチケットも買えるらしい。とにかく便利で部屋も満足。熱いシャワーも出る。'), 34 35 array('hotel_id' => '1', 'title'=>'ロケーション良い', 'date'=>'2016/10/21', 'number'=>'9', 'word'=>'満足', 'name'=>'Chandler', 'country'=>'JPN', 'text'=>'レビューが良かったので気になってたホテル。初めて泊まりましたが常宿決定。 新館に泊まりましたが、価格に対して部屋の広さ、設備が良い。周りに日本食屋が多い。隣りの焼肉屋がとても美味しかった。 ホテルのマッサージも良かった。 36 アヤラモールもタクシーですぐだし、銀行も徒歩圏内。旅行会社も並びにあるみたいで翌日のボホール島のチケットも買えるらしい。とにかく便利で部屋も満足。熱いシャワーも出る。'), 37 38 array('hotel_id' => '1', 'title'=>'素晴らし', 'date'=>'2017/10/29', 'number'=>'8', 'word'=>'満足', 'name'=>'Chandler', 'country'=>'JPN', 'text'=>'この値段でこのクオリティは素晴らしい。広さを除けば、部屋のグレードはマルコポーロ・ホテルと遜色ありません。 39 立地もよく便利なホテルです。前面道路の騒音だけがマイナスポイント。おススメです。'), 40 41 array('hotel_id' => '1', 'title'=>'GOOOD', 'date'=>'2018/10/03', 'number'=>'8', 'word'=>'非常に満足', 'name'=>'Chandler', 'country'=>'JPN', 'text'=>'動きやすい場所にあり、知名度もありホテルに帰るのが楽。部屋はリノベーションされてて綺麗で居心地よい。 42 近くにあるタイのスパはオススメです。前回に続き二度目の利用ですが、次回もここかな。'), 43 44 array('hotel_id' => '1', 'title'=>'とてもよかったです', 'date'=>'2015/12/23', 'number'=>'8', 'word'=>'満足', 'name'=>'Chandler', 'country'=>'JPN', 'text'=>'評判通りの良いホテル'), 45 46 array('hotel_id' => '1', 'title'=>'良いホテル”', 'date'=>'2016/01/23', 'number'=>'8', 'word'=>'非常に満足', 'name'=>'Chandler', 'country'=>'JPN', 'text'=>'また行きたいと思います'), 47 48 array('hotel_id' => '1', 'title'=>'パーティもある', 'date'=>'2019/01/12', 'number'=>'8', 'word'=>'非常に満足', 'name'=>'Chandler', 'country'=>'JPN', 'text'=>'セブに滞在の際利用しますが、交通の利便性、立地環境などがいいとおもいます。 49価格に対するパフォーマンスもgood!です。'), 50 51array('hotel_id' => '1', 'title'=>'プールがよかった', 'date'=>'2018/09/07', 'number'=>'8', 'word'=>'最高', 'name'=>'Chandler', 'country'=>'JPN', 'text'=>'1日の滞在でしたが、立地も分かりやすく、目の前のジャズバーももあり、いい環境でした。 52部屋のグレードも値段の割には申し分なしです。次回も滞在'), 53 54array('hotel_id' => '1', 'title'=>'また行きます', 'date'=>'2018/09/07', 'number'=>'8', 'word'=>'満足', 'name'=>'Chandler', 'country'=>'JPN', 'text'=>'1日の滞在でしたが、立地も分かりやすく、目の前のジャズバーももあり、いい環境でした。 55部屋のグレードも値段の割には申し分なしです。次回も滞在'), 56 57array('hotel_id' => '1', 'title'=>'wifiが無料', 'date'=>'2018/11/07', 'number'=>'8', 'word'=>'非常に満足', 'name'=>'Chandler', 'country'=>'JPN', 'text'=>'タクシーの運転手で知らない人がいなかったので、便利だった 58wifiが無料で普通に使えたこの値段からしたらかなりいいと思う横の焼肉屋がうまい タン塩が最高スタッフの愛想が良かった'), 59 60array('hotel_id' => '1', 'title'=>'気に入りました', 'date'=>'2016/09/21', 'number'=>'8', 'word'=>'非常に満足', 'name'=>'Chandler', 'country'=>'JPN', 'text'=>'レビューが良かったので気になってたホテル。初めて泊まりましたが常宿決定。 新館に泊まりましたが、価格に対して部屋の広さ、設備が良い。周りに日本食屋が多い。隣りの焼肉屋がとても美味しかった。 ホテルのマッサージも良かった。 61アヤラモールもタクシーですぐだし、銀行も徒歩圏内。旅行会社も並びにあるみたいで翌日のボホール島のチケットも買えるらしい。とにかく便利で部屋も満足。熱いシャワーも出る。') 62); 63 64 65//表示される 66//var_dump($mouths[0]); 67 68function getMouths($itemperpage, $currentpage) 69{ 70 $i = ($currentpage * $itemperpage) - $itemperpage; 71 for ($i; $i < $itemperpage; $i++) { 72 //表示される 73 var_dump('sample'); 74 $results[] = $mouths[$i]; 75 } 76 //表示されない 77 var_dump($mouths[0]); 78 return $results; 79} 80?>

こちらのPHPから呼び出します。

PHP

1<?php 2require_once("wordofmouth.php"); 3 4$currentpage = 1; 5$itemperpage = 5; 6 7var_dump(getMouths($itemperpage, $currentpage)); 8?>

これが表示結果となります。

string(6) "sample" string(6) "sample" string(6) "sample" string(6) "sample" string(6) "sample" NULL array(5) { [0]=> NULL [1]=> NULL [2]=> NULL [3]=> NULL [4]=> NULL }

getMouthsでvar_dump()をすると変す$i,$currentpage,$itemperpageにはきちんと値が入っていました。
なぜNULLになるのでしょうか。

bochan2👍を押しています

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

m.ts10806

2019/02/19 20:37

なぜ、前と同じ指摘をされてるのでしょうか? マニュアルも読まないしデバッグの場所はやり方はおかしいし 私の(かなり的確な)指摘には全く耳を貸さないし それでは成長するわけがない。
m.ts10806

2019/02/19 23:07

phpのエラーを表示設定してないのがそもそもの間違いですね
退会済みユーザー

退会済みユーザー

2019/02/19 23:23

コピペくんだからなあ 解決後にほぼ速攻で新しい質問でてるし 学ぶ気がないと結構前から思ってる
m.ts10806

2019/02/19 23:58

ひとまず、初めて見た気になって回答を大幅に書き換えてみよう。
m.ts10806

2019/02/20 12:33

私の回答で解決済みとしたという意味を深く考えないと痛い目をあいます。 何もコメントがないということは「何も理解していない」ということですよね。 通報しときますね。
guest

回答3

0

ベストアンサー

質問者さんの過去質問を見ましたが、毎度されているデバッグ依頼ですね。
本来非推奨な質問の域ですが、今回だけ答えてみます。
今後同様の質問がしなくてもいいようになれば幸いですね(ニッコリ

結論から

変数のスコープをきちんと理解されていないことから「なぜNULLになるのでしょうか」という質問になっています。

プログラムは指示したとおりにしか動きません。自分が思ったとおりに動くと思っていませんか?
その考えは今すぐ捨てましょう。
この内容で「なぜNULLになるのか」という質問が出る時点で質問者さんは思ったとおりコードを動かせる域には到底達していません。

ミニマムコード

質問者さんのやろうとしていることは下記と同等です。

php

1$a = [ 2 ["id"=>1, 3 "name"=>"test" 4 ], 5 ["id"=>2, 6 "name"=>"test2" 7 ], 8]; 9 10function get($num){ 11 $data = $a[$num]; 12 return $data; 13} 14var_dump(get(1));

require_once()しているから状況が違う、
と思われたのであればマニュアルをきちんと読み直してください。
同等であるためinlucde_once()の方に説明がありますが、
include_once 命令は、スクリプトの実行時に指定 したファイルを読み込み評価します
これはPHPの場合、実行時にそこを通ったらそのプログラムを実行することを意味します。

つまり、コードが書いてあるのと同義です。

さて、本題のミニマムコードに戻りますが。
「デバッグ依頼である」と私が結論づけるのも無理がなく、上記、質問者さんのコードと同等のコードを実行するとエラーになります。

PHP Notice: Undefined variable: a in XXX.php on line 13

質問者さんのほうでも同じコードを実行してみてください。
もし上記Noticeが出ていないのでしたら、エラー表示がOnになっていません。
学習段階であったり本番リリース前であったり、不完全なコードの状態では何が起きるか分かりません。
必ずエラー表示をOnにしてください。

※もしかしたら既に過去に指摘を受けているかもしれませんね。でもそれだけ大事です。

PHPマニュアル確認

で、ここで私が「結論」にリンクを貼った変数のスコープの項を見てみてください。

序盤に下記のようなコードがありますね。

php

1$a = 1; /* グローバルスコープ */ 2 3function test() 4{ 5 echo $a; /* ローカルスコープ変数の参照 */ 6} 7 8test();

このコード、私のミニマムコードとよく似ていると思いませんか?
それはつまり、質問者さんのコードと同等であることを示します。

ちなみにこのコードも同じNoticeを出力します。

Undefined variable: a
「未定義の変数:a」

エラーの調べかたとか読み方「質問前にすること」は下記が参考になりますよ。

「読んで理解して自身で実践できるようになるまで質問しない」くらいの気持ちで読んでください

つまり、変数が未定義であることを指します。
なぜかって、それはコメントに書いてある通りで、
PHPにおいて、関数は自身の中で定義された変数しか参照できないから です。
それがコメントで書いてある「ローカルスコープ変数の参照」の意味です。
JavaScriptと同じ感覚ではいけません。PHPの仕様です。覚えましょう。

PHPマニュアルより抜粋

このスクリプトは、出力を全く行いません。これは、echo 命令がローカ ル版の $a 変数を参照しているにもかかわらず、このスコープでは値が代入されていないからです。~中略~PHP では、グローバル変数は、関数の内部で使用する場合、関数の内部でグローバルとして宣言する必要があります。

まず一歩目

変数のスコープにあるようにglobalキーワードを使うとひとまずエラーが解消できます。

php

1$a = [ 2 ["id"=>1, 3 "name"=>"test" 4 ], 5 ["id"=>2, 6 "name"=>"test2" 7 ], 8]; 9 10function get($num){ 11 global $a; 12 $data = $a[$num]; 13 return $data; 14} 15var_dump(get(1));

出力結果

array(2) { ["id"]=> int(2) ["name"]=> string(5) "test2" }

2歩目

でもこれって意味がありません。
globalキーワードを使う是非はひとまず置いといて、
変数$aってどこも使ってませんよね。このget()関数のためだけに使うのは意味がないです。

引数に渡すのがその次。

php

1$a = [ 2 ["id"=>1, 3 "name"=>"test" 4 ], 5 ["id"=>2, 6 "name"=>"test2" 7 ], 8]; 9function get($num,$a){ 10 $data = $a[$num]; 11 return $data; 12} 13var_dump(get(1,$a));

でも、わざわざ定義した変数を引数で渡すって変な感じですよね。

それならこの方がいい。

php

1function get($num){ 2 $a = [ 3 ["id"=>1, 4 "name"=>"test" 5 ], 6 ["id"=>2, 7 "name"=>"test2" 8 ], 9 ]; 10 $data = $a[$num]; 11 return $data; 12} 13var_dump(get(1));

関数の中に定義してしまおうってことですね。
結局、変数$aはget()以外で直接どこからも参照されることがないのでしたら、これで充分です。

「データとしてしっかり持ちたいんだ」ということでしたら、
その変数$aをコード内に直接変数で持つのではなくデータベースで取得するか、クラスにしましょう。

php

1class a{ 2 private $a = [ 3 ["id"=>1, 4 "name"=>"test" 5 ], 6 ["id"=>2, 7 "name"=>"test2" 8 ], 9 ]; 10 function getByNum($num){ 11 return $this->a[$num]; 12 } 13} 14$obj_a = new a(); 15var_dump($obj_a->getByNum(1));

privateなので$obj_a->a;のようには参照できません。

もう一歩

クラスのメンバーでも関数でもなんでも同じですが、メソッドって引数に何が入ってくるか知りません
「プログラム組んでるんだから制御できるだろ」って思ったら大間違いです。
関数で準備した以上は、誰から実行されるかなんてわからないわけです。
複数人で同じプロジェクトで開発していたら、同じように使えるわけですし、引数って言っても変数です。変数は何が入っているか分からないもので、後から書き換え可能です。

実際のプログラムでは入力値が入ってきたりクエリストリングから受け取ったパラメータが入ってきたりして、本当に何が来るか分からないわけです。

下記のようにして引数の型を制限します。

※とりあえず「それならこれでいい」のコードで

php

1function get(int $num){ 2 $a = [ 3 ["id"=>1, 4 "name"=>"test" 5 ], 6 ["id"=>2, 7 "name"=>"test2" 8 ], 9 ]; 10 $data = $a[$num]; 11 return $data; 12}

これでget("a")とか、int(整数型)以外を与えるとエラーが出るようになりました。
でも、これでも不十分です。
確実に存在する値が引数として与えられるか保証はありませんよね。
この場合、2とか与えられたら下記のようなエラーが出ます。

PHP Notice: Undefined offset: 2 in XXX.php on line 11

未定義のオフセット:2

つまり、配列に存在しないポイント、という意味ですね。
※配列にキーが存在しない場合と同等です

阻止するために、「存在するキーが与えられていたら取得」としましょう。

php

1function get(int $num):array{ 2 $a = [ 3 ["id"=>1, 4 "name"=>"test" 5 ], 6 ["id"=>2, 7 "name"=>"test2" 8 ], 9 ]; 10 if(array_key_exists($num,$a)){ 11 return $a[$num]; 12 } 13 return []; 14}

ついでに、返り値の型も宣言しておき、存在した場合、そのまま返却、そうでない場合は空の配列を返すようにしました。
これでひとまずいい感じにはできましたね。

あとは自身のコードに考え方を反映するだけ!
頑張ってください。

ちなみに短く書くならこう。

php

1function get(int $num):array{ 2 $a = [ 3 ["id"=>1, 4 "name"=>"test" 5 ], 6 ["id"=>2, 7 "name"=>"test2" 8 ], 9 ]; 10 return (array_key_exists($num,$a))?$a[$num]:[]; 11}

デバッグについて

そういえば、各所でvar_dump()を入れられてデバッグをされていますが、本来確認しなければならない項目を確認していません。

ひとつめ。
「処理がここまで通ってるよ」という確認は必要ですが、sampleという文言だけではどこかは分かりません。
せめて一意になる数字にしましょう。
ちなみに下記のように書くとそのプログラムの行数が出ます。

php

1echo __LINE__."<br />\n";//重なってはいけないので改行を入れておく

ふたつめ。
確認しなければならない変数。
$mouthsという変数をグローバルスコープで下記のように確認したことで

php

1//表示される 2//var_dump($mouths[0]);

getMouths()内で使えるぜ!と思ったかもしれませんが、根拠はどこですか?

いずれにしても、本当に使えるかどうか確認しなければなりませんよね。

php

1function getMouths($itemperpage, $currentpage) 2{ 3 var_dump($mouths); 4 //後略 5}

こうしておけば、最初のNoticePHP Notice: Undefined variable:が出て気づけたでしょうね。
(エラー表示OFFだとnullかな)

デバッグの仕方、本来確認すべき項目はきちんとおさえるようにしないと、デバッグがデバッグになりません。気をつけましょう。

質問者さんは思ったとおりコードを動かせる域には到底達していません。


蛇足:
きちんと意味のある変数名つけてますか?
mouthって「口」ですけど。
「口コミ」なら「reviews」ですね。レビュー。
他人が見ても意味が分かる内容にしておかないと、数ヵ月後自分が見たときも意味が分かりませんよ。

言語に限らず、下記のような記事はきちんと読んでおいて取り入れるようにしましょう。

投稿2019/02/19 20:34

編集2019/02/20 02:18
m.ts10806

総合スコア80850

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

m.ts10806

2019/02/19 23:58 編集

誤送信修正
guest

0

PHP

1var_dump(getMouths(5,1,$mouths)); 2 3function getMouths($itemperpage, $currentpage,$mouths) 4{ 5 for ($i = ($currentpage-1) * $itemperpage; $i < $itemperpage; $i++) { 6 $results[] = $mouths[$i]; 7 } 8 return $results; 9}

投稿2019/02/20 00:22

yambejp

総合スコア114833

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

php

1function getMouths($itemperpage, $currentpage, $mouths)

にして、呼び出すときに第三引数渡してください

投稿2019/02/20 00:15

papinianus

総合スコア12705

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

m.ts10806

2019/02/20 01:03

「Mouthsって何でだろう」って1時間くらい考えた結果、最後の蛇足に行き着きました。
papinianus

2019/02/20 02:20

同じ類推をしました
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問