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

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

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

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

Q&A

解決済

1回答

463閲覧

PHPで引数に指定した内容を、指定の連想配列から取得

theearth

総合スコア11

PHP

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

0グッド

0クリップ

投稿2019/10/12 02:29

編集2019/10/12 06:52

###実現したいこと
こちらの連想配列から、キーと値の指定でその行の配列を取得したいです。

###該当の連想配列

$set_arr = [ [ 'key'=>'a', 'hold'=>['cat'], 'use'=>['mew'], 'action_name'=>'honk', 'action_update'=>['animal','cute'] ], [ 'key'=>'b', 'hold'=>['dog'], 'use'=>['bow'], 'action_name'=>'bark', 'action_update'=>['animal','cool'] ], [ 'key'=>'c', 'hold'=>['cow'], 'use'=>['moo'] ], ];

###取得したい例
(例1)「action_nameがhonk」と指定
→1つだけなので下記を取得

// $resultに以下を取得したい [[ 'key'=>'a', 'hold'=>['cat'], 'use'=>['mew'], 'action_name'=>'honk', 'action_update'=>['animal','cute'] ]]

(例2)「action_updateにanimalを含む」と指定
→2つあるので下記を取得

// $resultに以下を取得したい [ [ 'key'=>'a', 'hold'=>['cat'], 'use'=>['mew'], 'action_name'=>'honk', 'action_update'=>['animal','cute'] ], [ 'key'=>'b', 'hold'=>['dog'], 'use'=>['bow'], 'action_name'=>'bark', 'action_update'=>['animal','cool'] ], ];

(例3)
あとは下記「試した関数」の最後の行で「ちなみに」とコメントしてあるように、例1と例2を「かつ」で合わせてもできるようになれればと思っています。

###試した関数
PHP初心者で調べた限界で、ご覧のように書いているのですが、nllとなってしまい、直し方がわかりません。どうやったらできるか教えて頂けませんでしょうか。

<?php function get_set_arr( $hold=null, $use=null, $action_name=null, $action_update=null ){ $set_arr = [ [ 'key'=>'a', 'hold'=>['cat'], 'use'=>['mew'], 'action_name'=>'honk', 'action_update'=>['animal','cute'] ], [ 'key'=>'b', 'hold'=>['dog'], 'use'=>['bow'], 'action_name'=>'bark', 'action_update'=>['animal','cool'] ], [ 'key'=>'c', 'hold'=>['cow'], 'use'=>['moo'] ], ]; // 引数をもとに一致する行の配列を返す $result = []; foreach( $set_arr as $set ){ if( $hold==null ? true : $hold==$set['hold'] && $use==null ? true : $use==$set['use'] && $action_name==null ? true : $action_name==$set['action_name'] && $action_update==null ? true : $action_update==$set['action_update'] ){ $result[] = $set; } } return $result; } $args = ['hold'=>['cat']]; $result = get_set_arr( $args ); var_dump( $result ); /* ちなみに $args = [ 'hold'=>['cat'], 'action_name'=>'honk' ]; など複数指定もやりたいです */

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

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

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

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

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

guest

回答1

0

ベストアンサー

ゴリゴリですが、いちおう書いてみました。
たぶんやりたいことはこうだと思います。

php

1function isMatch($args, $set) { 2 foreach ($args as $key => $vals) { 3 if (!array_key_exists($key, $set)) { 4 return false; 5 } 6 if (is_array($vals)) { 7 foreach ($vals as $val) { 8 if (!in_array($val, $set[$key], true)) { 9 return false; 10 } 11 } 12 } else { 13 if ($vals !== $set[$key]) { 14 return false; 15 } 16 } 17 } 18 return true; 19} 20function get_set_arr($args) { 21 $set_arr = [ 22 [ 'key'=>'a', 'hold'=>['cat'], 'use'=>['mew'], 'action_name'=>'honk', 'action_update'=>['animal','cute'] ], 23 [ 'key'=>'b', 'hold'=>['dog'], 'use'=>['bow'], 'action_name'=>'bark', 'action_update'=>['animal','cool'] ], 24 [ 'key'=>'c', 'hold'=>['cow'], 'use'=>['moo'] ], 25 ]; 26 27 // 引数をもとに一致する行の配列を返す 28 $result = []; 29 foreach ($set_arr as $set){ 30 if (isMatch($args, $set)) { 31 $result[] = $set; 32 } 33 } 34 return $result; 35} 36 37function print_result($result) { 38 echo(join(',', array_column($result, 'key')) . "\n"); 39} 40print_result(get_set_arr(['hold'=>['cat']])); // => a 41print_result(get_set_arr(['action_name'=>'honk'])); // => a 42print_result(get_set_arr(['action_name'=>'bark'])); // => b 43print_result(get_set_arr(['action_update'=>['animal']])); // => a,b 44print_result(get_set_arr(['hold'=>['cat'], 'action_name'=>'honk'])); // => a 45print_result(get_set_arr(['hold'=>['cat'], 'action_name'=>'bark'])); // => (なし) 46print_result(get_set_arr([])); // => a,b,c 47print_result(get_set_arr(['use'=>['moo']])); // => c

投稿2019/10/12 05:51

編集2019/10/12 08:01
tanishi_a

総合スコア484

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

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

theearth

2019/10/12 06:10

そしたら「試した関数」にある$resultで、3つとも取得してしまいませんか? $argsにある通り、「hold」が「cat」の配列だけ取得したんですよね…
tanishi_a

2019/10/12 06:21 編集

失礼しました。よく読まずに回答しちゃってました。 回答を訂正しました。
theearth

2019/10/12 06:27

いえ意図を伝えるのがへたですみません。ご訂正拝見しました。 こちらを仰っているのだと思いますができないようでした。 https://3v4l.org/WfVEu
tanishi_a

2019/10/12 06:36

or でつないでいる分を カッコでくくってあげれば大丈夫そうに見えます。 if ( ( A ) || ( B ) || ( C ) || ( D )
theearth

2019/10/12 06:47

なるほど、しかしそれですと配列ではない例1ができませんね… // 例2はできる $args = ['hold'=>['cat']]; $result = get_set_arr( $args ); // 例1はできない $args = ['action_name'=>'honk']; $result = get_set_arr( $args );
tanishi_a

2019/10/12 07:08

その関数の定義だと、action_name の指定は こうだと思いますが、 ```php $result = get_set_arr(null, null, ['action_name'=>'honk']); ``` 質問文を読み直して気がついたのですが、 よく見ると、下記のはもうちょっと直さないと出来ませんね。 > action_updateにanimalを含む せっかくなのでちょっと考えてみます。
theearth

2019/10/12 07:18

関数は初心者が作ったものなのであまりアテにしないでください… 例3もあって手ごわいですが、どうぞ宜しくお願い致します。
theearth

2019/10/12 08:13

array_key_existsやis_arrayなどはじめて知りました。配列かどうかで分岐してあげるんですね。 伝わりにくい質問に対してどうもありがとうございます。完璧なコードでした。
tanishi_a

2019/10/12 08:14

解決してよかったです!
theearth

2019/10/12 08:17

(*TーT)bグッ!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問