質問編集履歴

1 dumpのテスト結果を追記しました。

tajix_japan

tajix_japan score 97

2017/01/05 06:02  投稿

【PHP】APIで変数をjson方式に変換したい
もとのページは下記のようになっています。
http://example.com/moto.html?fm=woman
【no】1【name】Yamada【】<BR>
【no】2【name】Tanaka【】<BR>
これと同列の位置にphp (http://example.com/api_1.php) を置き、上記の文字をアプリに渡すAPIとしたいと考えています。
まずは、moto.html のデータをjson方式に変換するため、str_replaceを利用して変換します。
【PHP その1】
```PHP
<?php
$crawler="http://example.com/moto.html?fm=woman";
$homepage = file_get_contents($crawler);
$moto = array("【no】", "【name】", "【】<BR>");
$api_1  = array("['no'=>'", "','name'=>'", "'],");
$newphrase = str_replace($moto, $api_1, $homepage);
echo $newphrase;
?>
```
これで無事 echo $newphrase; の部分が
['no'=>'1','name'=>'Yamada'],['no'=>'2','name'=>'Tanaka'],
とHTML上で表示されました。
一方、下記のようなjson方式で吐き出すPHPがあります。
【PHP その2】
```PHP
<?php
function returnJson($resultArray){
 if(array_key_exists('callback', $_GET)){
   $json = $_GET['callback'] . "(" . json_encode($resultArray) . ");";
 }else{
   $json = json_encode($resultArray);
 }
 header('Content-Type: text/html; charset=utf-8');
 echo $json;
 exit(0);
}
$type = $_REQUEST['user_type'];
// ユーザリストの初期化
$user_list = [];
// 返却値の初期化
$result = [];
try {
 // 値の検証
 if (empty($type)) {
   throw new Exception("no type...");
 }
 // ユーザリストの作成
 switch ($type) {
   case 'a':
     $user_list =
[
['no'=>'10','name'=>'Yoshida'],
['no'=>'11','name'=>'Mori']
     ];
     break;
   default:
     // 不正な値
     throw new Exception("Invalid value...");
     break;
 }
 // 返却値の作成
 $result = [
   'result' => 'OK',
   'users' => $user_list
 ];
} catch (Exception $e) {
 $result = [
   'result' => 'NG',
   'message' => $e->getMessage()
 ];
}
// JSONでレスポンスを返す
returnJson($result);
?>
```
上記のwebAPIを$type=aで叩くと
[{"no":"11","name":"Yoshida"},{"no":"12","name":"Mori"}]
が返ってきます。
【やりたいこと】
上記の2つを組み合わせて、
http://example.com/moto.html?fm=woman" にある
【no】1【name】Yamada【】<BR>
【no】2【name】Tanaka【】<BR>
[{"no":"1","name":"Yamada"},{"no":"2","name":"Tanaka"}]
のJSON方式で吐き出させたいと考えました。
【やってみたこと】
【PHPその2】にある
['no'=>'10','name'=>'Yoshida'],
['no'=>'11','name'=>'Mori']
の部分を
【PHPその1】にある
$newphrase に差し替えるだけで出来そうに感じました。
そこでPHPその1とその2を下記のように合体させました。
```PHP
<?php
$crawler="http://example.com/moto.html";
$homepage = file_get_contents($crawler);
$moto = array("【no】", "【name】", "【】<BR>");
$api_1  = array("['no'=>'", "','name'=>'", "'],");
$newphrase = str_replace($moto, $api_1, $homepage);
function returnJson($resultArray){
 if(array_key_exists('callback', $_GET)){
   $json = $_GET['callback'] . "(" . json_encode($resultArray) . ");";
 }else{
   $json = json_encode($resultArray);
 }
 header('Content-Type: text/html; charset=utf-8');
 echo $json;
 exit(0);
}
$type = $_REQUEST['user_type'];
// ユーザリストの初期化
$user_list = [];
// 返却値の初期化
$result = [];
try {
 // 値の検証
 if (empty($type)) {
   throw new Exception("no type...");
 }
 // ユーザリストの作成
 switch ($type) {
   case 'a':
     $user_list =
[
$newphrase
     ];
     break;
   default:
     // 不正な値
     throw new Exception("Invalid value...");
     break;
 }
 // 返却値の作成
 $result = [
   'result' => 'OK',
   'users' => $user_list
 ];
} catch (Exception $e) {
 $result = [
   'result' => 'NG',
   'message' => $e->getMessage()
 ];
}
// JSONでレスポンスを返す
returnJson($result);
?>
```
結果
{"result":"OK","users":[[""]]}
と、"result":"OK"は出るものの中身が吐き出されません。
echo $newphraseだとHTML上に吐き出すことができるのにです。
何が問題なのでしょうか?
どうすれば、$newphrase を 変数
['no'=>'1','name'=>'Yamada'],['no'=>'2','name'=>'Tanaka'],
として読んでくれるようになりますでしょうか?
よろしくお願いいたします。
よろしくお願いいたします。
追記
>$newphrase に代入したすぐ後の var_dump を採って追記いただけますか?
kei344様
有難うございます。
$_REQUEST['user_type']の部分を$type = 'a';とリクエストを受け取った形に変形してテストしました。
```php
//$type = $_REQUEST['user_type'];
$type = 'a';
// ユーザリストの初期化
$user_list = [];
// 返却値の初期化
$result = [];
try {
 // 値の検証
 if (empty($type)) {
   throw new Exception("no type...");
 }
 // ユーザリストの作成
 switch ($type) {
   case 'a':
   case 'admin':
     $user_list =
[
$newphrase
     ];
     break;
var_dump($newphrase);
以下同文
```
と記載してみました。
結果
{"result":"OK","users":[{"no":"1","name":"Yamada"},{"no":"2","name":"Tanaka"}]}
となるべきところが
{"result":"OK","users":["\ufeff[{"no":"1","name":"Yamada"},{"no":"2","name":"Tanaka"],"]}
と ["\ufeff 及び "] のへんてこな文字が混じっていることがわかりました。
\ufeffをググるとBOM付でこれが出ると書かれていたのですが、確認したところBOM付で記載してはいません。改行コードも自動判定からLFに変更しましたがやはり変化がありません。
(遅くなりましたが環境はCent OS 6.8です)
当方は今回初めてAPIを作ることになるため、下記をベースに開発しています。
http://qiita.com/busyoumono99/items/9b5ffd35dd521bafce47
ここのサンプルの標準で用意されている下記のcace 'g'を追記し
$_REQUEST['user_type']の部分を$type = 'g';としてテストしました。
```php
   case 'g':
   case 'guest':
     $user_list = [
       ['name'=>'香取','age'=>14],
       ['name'=>'草薙','age'=>15],
       ['name'=>'稲垣','age'=>15],
       ['name'=>'岡田','age'=>15],
       ['name'=>'森田','age'=>15],
       ['name'=>'三宅','age'=>15],
      ['name'=>'長野','age'=>15],
       ['name'=>'坂本','age'=>15],
       ['name'=>'井ノ原','age'=>15]
     ];
     break;
   default:
```
結果
{"result":"OK","users":[{"name":"\u9999\u53d6","age":14},{"name":"\u8349\u8599","age":15},{"name":"\u7a32\u57a3","age":15},{"name":"\u5ca1\u7530","age":15},{"name":"\u68ee\u7530","age":15},{"name":"\u4e09\u5b85","age":15},{"name":"\u9577\u91ce","age":15},{"name":"\u5742\u672c","age":15},{"name":"\u4e95\u30ce\u539f","age":15}]}
と普通にdump出来ます。
上記のテストから$newphraseを代入するとゴミ文字が入ってくることで表示出来なくなっていることがわかりました。
もう一歩だと思いますので何かアドバイスできることがございましたらよろしくお願いいたします。
  • PHP

    38031 questions

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

思考するエンジニアのためのQ&Aサイト「teratail」について詳しく知る