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

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

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

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

Ajax

Ajaxとは、Webブラウザ内で搭載されているJavaScriptのHTTP通信機能を使って非同期通信を利用し、インターフェイスの構築などを行う技術の総称です。XMLドキュメントを指定したURLから読み込み、画面描画やユーザの操作などと並行してサーバと非同期に通信するWebアプリケーションを実現することができます。

Q&A

解決済

1回答

1122閲覧

Ajax取得できた配列が空で表示される

Chandler_Bing

総合スコア673

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

Ajax

Ajaxとは、Webブラウザ内で搭載されているJavaScriptのHTTP通信機能を使って非同期通信を利用し、インターフェイスの構築などを行う技術の総称です。XMLドキュメントを指定したURLから読み込み、画面描画やユーザの操作などと並行してサーバと非同期に通信するWebアプリケーションを実現することができます。

1グッド

0クリップ

投稿2019/02/14 11:21

以下のコードを実行するとconsole.log()の部分で取得できた入れsつが表示されず、空の配列が表示されます。

質問❶
書く位置が悪いのでしょうか。通信がまだ終了していないということでしょうか。
質問❷
console.log()をした際、表示がPHPファイルの中の$hotelsを受け取る時だけ

[Object, Object, Object] (3)

となり
$pics,$tagsの時は

[{hotel_id: "1", country_code: "PHL", pic: "hotel_idが1の画像です"}, {hotel_id: "2", country_code: "PHL", pic: "hotel_idが2の画像です"}, {hotel_id: "3", country_code: "PHL", pic: "hotel_idが3の画像です"}]

のようになります。これはなぜでしょうか。

JS

1<script> 2 $(function() { 3 var array = []; 4 var hotels = []; 5 var hotelpics = []; 6 var hoteltags = []; 7 8 // 関数からは$.postの結果をreturnする 9 function pics() { 10 return $.post('sampleAjax.php', { 11 kind: 'pics' 12 }); 13 }; 14 15 function tags() { 16 return $.post('sampleAjax.php', { 17 kind: 'tags' 18 }); 19 }; 20 21 $('#sortbyprice').on('click', function() { 22 $.post('sampleAjax.php', { 23 kind: 'hotels' 24 }, function(result) { 25 hotels = result; 26 pics().done(function(result) { 27     //ここでresultコンソールすると配列が表示される 28 hotelpics = result; 29 }); 30 tags().done(function(result) { 31 //ここでresultコンソールすると配列が表示される 32 hoteltags = result; 33 }); 34 //空のの値が表示される 35 console.log(hotels); 36 console.log(hotelpics); 37 console.log(hoteltags); 38 }); 39 return false; 40 }); 41 }); 42</script>

PHP

1<?php 2//返すデータ 3//以下の配列はDBから取得したものであると仮定する。 4//ホテルの基本情報(値段でソートした設定) 5$hotels = array( 6 array('hotel_id' => '1', 'country_code'=>'PHL', 'hotel_name'=>'SARROSAホテル', 'hotel_address'=>'セブ シティ, セブ', 'hotel_tel'=>'12345', 'price'=>'30'), 7 array('hotel_id' => '2', 'country_code'=>'PHL', 'hotel_name'=>'SPAホテル', 'hotel_address'=>'セブ シティ, セブ', 'hotel_tel'=>'12345', 'price'=>'40'), 8 array('hotel_id' => '3', 'country_code'=>'PHL', 'hotel_name'=>'MATTHERホテル', 'hotel_address'=>'セブ シティ, セブ', 'hotel_tel'=>'12345', 'price'=>'50') 9); 10 11//$hotelsに含まれているそれぞれのホテルの画像(DBの設定によりホテルの数と必ず一致する。今回はホテルが3つなのでこちらも同じ) 12$pics = array( 13 array('hotel_id' => '1', 'country_code'=>'PHL', 'pic'=>'hotel_idが1の画像です'), 14 array('hotel_id' => '2', 'country_code'=>'PHL', 'pic'=>'hotel_idが2の画像です'), 15 array('hotel_id' => '3', 'country_code'=>'PHL', 'pic'=>'hotel_idが3の画像です') 16); 17//ホテル側が自由に複数持つことができるタグ。 18$tags = array( 19 array('hotel_id' => '1', 'country_code'=>'PHL', 'tag'=>'無料Wi-Fi'), 20 array('hotel_id' => '1', 'country_code'=>'PHL', 'tag'=>'後日支払い可'), 21 array('hotel_id' => '1', 'country_code'=>'PHL', 'tag'=>'宿泊施設へ直接支払い'), 22 array('hotel_id' => '2', 'country_code'=>'PHL', 'tag'=>'キャンセル無料'), 23 array('hotel_id' => '2', 'country_code'=>'PHL', 'tag'=>'無料Wi-Fi'), 24 array('hotel_id' => '3', 'country_code'=>'PHL', 'tag'=>'無料Wi-Fi'), 25 array('hotel_id' => '3', 'country_code'=>'PHL', 'tag'=>'後日支払い可'), 26 array('hotel_id' => '3', 'country_code'=>'PHL', 'tag'=>'宿泊施設へ直接支払い'), 27 array('hotel_id' => '3', 'country_code'=>'PHL', 'tag'=>'朝食付き'), 28 array('hotel_id' => '3', 'country_code'=>'PHL', 'tag'=>'キャンセル無料') 29); 30 31/* 32表示に関して 33HTML .hotel .nameクラスは $hotelsのhotel_name 34HTML .hotel .priceクラスは $hotelsのhotel_price 35HTML .hotel .imgクラスは $$picsのpic 36HTML .tags .tagクラスは $tagsのtag 37*/ 38// $allOfHotelsInfo = array($hotels,$pics,$tags); 39 40if ($_SERVER['REQUEST_METHOD'] === 'POST') { 41 if (isset($_POST['kind']) && $_POST['kind'] == 'pics') { 42 header('Content-Type: application/json'); 43 echo json_encode($pics); 44 exit; 45 } elseif (isset($_POST['kind']) && $_POST['kind'] == 'tags') { 46 header('Content-Type: application/json'); 47 echo json_encode($tags); 48 exit; 49 } elseif (isset($_POST['kind']) && $_POST['kind'] == 'hotels') { 50 header('Content-Type: application/json'); 51 echo json_encode($hotels); 52 exit; 53 } 54}
bochan2👍を押しています

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

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

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

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

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

m.ts10806

2019/02/14 11:53

何度も指摘されてると思いますが、あなたがやろうとしていることはあなたの持っている技術知識に対しては難しすぎるので基礎の基礎の基礎からやりなおすことを強くすすめる。 プログラムは思った通りに動くのではなく書いた通りにしか動かない。 それがわかるまでHelloWorldから脱することはできません。
guest

回答1

0

ベストアンサー

javascript

1 pics().done(function(result) { 2     //ここでresultコンソールすると配列が表示される 3 hotelpics = result; 4 }); 5 tags().done(function(result) { 6 //ここでresultコンソールすると配列が表示される 7 hoteltags = result; 8 }); 9 //空のの値が表示される 10 console.log(hotels); 11 console.log(hotelpics); 12 console.log(hoteltags);

無名関数の外だから、スコープの問題で値を参照できません。

投稿2019/02/14 11:48

編集2019/02/14 11:56
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

m.ts10806

2019/02/14 11:54

どうやったらこんなコードになるのだろうと疑問しかないですねえ…
退会済みユーザー

退会済みユーザー

2019/02/14 11:58

失礼承知ですが、なんでこうも物覚えが悪いのだろうと、甚だ疑問。 なんでわからないのかを素直に聞いてみたいです。
m.ts10806

2019/02/14 12:18

思った通りに動くというところから離れてないからかなと。好き勝手に書いて「どこか間違ってる?」という質問ばかりですし。
Chandler_Bing

2019/02/14 12:19

ありがとうございました。この問題は理解できました。
退会済みユーザー

退会済みユーザー

2019/02/14 12:21

@YutaNkai 本当に理解してます? 同じことを何回も繰り返している印象ですが。
退会済みユーザー

退会済みユーザー

2019/02/14 13:24

やめてあげて、彼の応用力はマイナスよ(おい
m.ts10806

2019/02/14 17:14

問題の本質が自身にあることに気づけないと無理でしょうね…。枝葉ばかりで幹ボロボロ。その枝葉も枝があればまだいい方
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問