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

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

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

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

Q&A

解決済

1回答

274閲覧

PHP多次元連想配列を検証したい

mickymouse

総合スコア3

PHP

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

0グッド

0クリップ

投稿2020/07/08 05:01

編集2020/07/08 06:48

###実現したいこと
検証対象$responseに対して、型が$required_infoの指定通りであることを検証する関数を作りたいです。

###問題
パターン1やパターン2のように次元の数や構造が異なるのですが、いずれにも対応できるような関数が作れません。

###パターン1

PHP

1// 検証対象 2$response = [ 3 [ 4 'title' => 'shortcake' 5 ,'tag_list' => ['kids'] 6 ,'ranking' => 1 7 ,'side' => [ 8 'url' => 'http...' 9 ,'name' => 'karaage' 10 ,'id' => 10 11 ] 12 ] 13]; 14 15// 型を指定 16$required_info = [ 17 'title' => 'string' 18 ,'tag_list' => 'array' 19 ,'side' => [ 20 'url' => 'string' 21 ,'name' => 'string' 22 ,'id' => 'integer' 23 ] 24]; 25

###パターン2

PHP

1// 検証対象 2$response = [ 3 'titles' => [ 4 'name' => 'coconut juice' 5 ,'thumbnails' => 'http...' 6 ] 7 ,'data' => [ 8 'id' => [ 9 'a_id' => 10 10 ,'b_id' => 20 11 ] 12 ] 13]; 14 15// 型を指定 16$required_info = [ 17 'titles' => [ 18 'name' => 'string' 19 ,'thumbnails' => 'string' 20 ] 21 ,'data' => [ 22 'id' => [ 23 'a_id' => 'integer' 24 ] 25 ] 26]; 27

###関数イメージ
作りたい関数のイメージはこちらです。

php

1// 実行 2$result = validate_required_in_response( 'cake', $response ); 3var_dump($result); 4 5// $responseのリストそれぞれについて、$required_info で指定した型がおかしければfalseを返す 6function validate_required_in_response( $kind, $response ){ 7 8 // 引数に応じて型を指定 9 if ( $kind === 'cake' ) { 10 // 型を指定 11 $required_info = [ 12 'title' => 'string' 13 ,'tag_list' => 'array' 14 ,'side' => [ 15 'url' => 'string' 16 ,'name' => 'string' 17 ,'id' => 'integer' 18 ] 19 ]; 20 } 21 22 elseif ( $kind === 'drink' ) { 23 // 型を指定 24 $required_info = [ 25 'titles' => [ 26 'name' => 'string' 27 ,'thumbnails' => 'string' 28 ] 29 ,'data' => [ 30 'id' => [ 31 'a_id' => 'integer' 32 ] 33 ] 34 ]; 35 } 36 37 // 検証開始 38 $result = true; 39 foreach ( $response as $value ) { 40 // 検証対象$responseに対して、型が$required_infoの指定通りであることを検証したいです 41 } 42 return $result; // 型がおかしければfalseを返したい 43}

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

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

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

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

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

guest

回答1

0

ベストアンサー

どこまでの仕様かわからないですが

投稿2020/07/08 05:31

yambejp

総合スコア114843

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

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

yambejp

2020/07/08 05:31

<?PHP $response_cakes = [ [ 'title' => 'shortcake', 'tag_list' => ['kids'], 'ranking' => 1, 'side' => [ 'url' => 'http...', 'name' => 'karaage', 'id' => 10, ], ], [ 'title' => 'montblanc', 'tag_list' => ['kids','chestnut'], 'side' => [ 'url' => 'http...', 'name' => null, 'id' => 10, ], ], [ 'side' => [ ], ], [ ], ]; $result=array_map(function($x){ return isset($x['side']['name'])?$x['side']['name']:null; },$response_cakes); var_dump($result);
mickymouse

2020/07/08 05:37

ありがとうございます。 ['side']['name']という検証対象は、$required_infoで指定しているために検証対象になっているだけで、$required_infoは不定で、そこが困っているとこです。
yambejp

2020/07/08 05:42

> $required_infoで指定している 指定の仕方によります。どういうデータが入る予定ですか?
mickymouse

2020/07/08 05:45

$required_infoは質問に2パターンありますが、何か不足でしょうか? $required_infoの次元数はいろいろあり、そこが困っているところです。
yambejp

2020/07/08 05:48

ごめんなさい、だらだら書かれてズバリどういう仕様かわかりません どういうデータからどういうパターンを元にどう値を得たいかを まとめなおせば解決すると思いますよ
mickymouse

2020/07/08 06:42

すみません・・お目汚しな自作コードは削除いたしました。 編集したのですが、いかがですか?
mickymouse

2020/07/08 06:49

さらに不要な引数なども削除して、質問の趣旨に合った機能に絞らせて頂きました。
yambejp

2020/07/08 06:56

パターン1について $responseの各要素が$required_infoで指定した型と合うかどうか? という意味ですかね? データに致命的な欠陥があるのですが $responseのtag_listを配列かどうかジャッジしているように見えますが そうなると、$required_info のsideもarrayを指定しないと 定義がぶれます 再帰処理を無理やりやってもいいですが、かなり無理があると思います
mickymouse

2020/07/08 07:14 編集

仰る通りの意味です。つたない質問で大変お手数おかけしました。 なるほどたしかに定義がぶれますね。 ■$response の tag_list は array で、その中の値は気にしない([string,string]な値であればOK)。 ■$response の side は array で、その中身もそれぞれ検証したい。 ここが難点ということですよね。 目的は「$responseの値が想定通りか?」なので、「$response」は変えられませんが「$required_info」は変えてしまっても構いません。 定義がぶれないような指定ですと・・何かうまい指定ございませんでしょうか?
mickymouse

2020/07/08 07:18

こちらの指定だといかがでしょうか。冗長すぎるでしょうか。 // 型を指定 $required_info = [ 'title' => ['type'=>'string'] ,'tag_list' => ['type'=>'array'] ,'side' => [ 'type' => 'array' ,'value' => [ 'url' => ['type'=>'string'] ,'name' => ['type'=>'string'] ,'id' => ['type'=>'integer'] ] ] ];
mickymouse

2020/07/08 07:27

または次のようにダミーの値を入れて、同じ型かどうかを比較するという方法がよさそうでしょうか。悩みます・・ // 型を指定 $required_info = [ 'title' => 'x' ,'tag_list' => [] ,'side' => [ 'url' => 'x' ,'name' => 'x' ,'id' => 0 ] ];
yambejp

2020/07/08 07:33

無理やりやってみました。再帰処理も面倒なので冗長にかいてあります 型があっていればtrue、違えばfalse、なければnullを返します
yambejp

2020/07/08 07:33

$required_info = [ ['keys'=>['title'] ,'type'=>'string' ], ['keys'=>['tag_list'] ,'type'=>'array' ], ['keys'=>['ranking'] ,'type'=>'string' ], ['keys'=>['side'] ,'type'=>'array' ], ['keys'=>['side','url'] ,'type'=>'string' ], ['keys'=>['side','name'],'type'=>'string' ], ['keys'=>['side','id'] ,'type'=>'integer'], ['keys'=>['side','test'],'type'=>'integer'], ]; $result=array_map(function($x) use($response){ $ret=null; if(count($x["keys"])==1){ if(isset($response[0][$x["keys"][0]])){ $ret=gettype($response[0][$x["keys"][0]])==$x["type"]; } } if(count($x["keys"])==2){ if(isset($response[0][$x["keys"][0]][$x["keys"][1]])){ $ret=gettype($response[0][$x["keys"][0]][$x["keys"][1]])==$x["type"]; } } return $ret; },$required_info); var_dump($result);
mickymouse

2020/07/08 07:52

なるほど、そちらの指定は思いつきませんでした。 true、false、nullと3種類で返せるというのも助かります。 お忙しい中何度もやりとりして下さいまして、誠にありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問