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

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

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

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

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Ajax

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

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

Q&A

解決済

3回答

196閲覧

配列の値を複数検索したい

MeB

総合スコア104

PHP

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

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Ajax

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

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

0グッド

0クリップ

投稿2018/08/21 01:35

編集2018/08/22 00:14

前提・実現したいこと

fromからの値を取って来てそれに対応した項目(配列)を表示させたいのですが、
formの1つの値を value="1,2" のような感じにして複数個取得してヒットしたものを表示させたいです。

現状はvalueが1つであれば動く状態です。valueの中が2つ以上(value="1,2,3")の場合は動かないです。
訂正
現状はvalueが1つであれば正常に検索され該当の配列のみが表示されます。
valueの中が2つ以上(value="1,2,3")の場合は下記のphpに記述しましたが"チェックされてない"が表示されます。

該当のソースコード

html

1<form id="form" name="search" action="" method="POST"> 2 <div class="form-list"> 3 <p>タイプ</p> 4 <input type="radio" id="type01" name="type" value="1"><label for="type01">1</label> 5 <input type="radio" id="type02" name="type" value="2,3,4"><label for="type02">2以降</label> 6 </div> 7 <div class="form-list"> 8 <p>カラー</p> 9 <input type="radio" id="color01" name="color" value="red"><label for="color01"></label> 10 <input type="radio" id="color02" name="color" value="blue,green"><label for="color02">青または緑</label> 11 </div> 12 <button class="submit" value="check">検索</button> 13 </form>

js

1//ajaxの処理が2回あるのは検索ボタンを押す前に全項目を表示させておきたいからなのですが、 2//1回で済む記述があればご教示していただきたいです。ついでの質問ですみません。 3$(function () { 4 $.ajax({ 5 url: 'ajax.php', 6 type: "POST", 7 dataType: "html", 8 }).done(function(data){ 9 $('.result').html(data); 10 }); 11 12 $('button').on('click',function(event) { 13 event.preventDefault(); 14 var html = ''; 15 var formdata = new FormData($('#form').get(0)); 16 $.ajax({ 17 url: 'ajax.php', 18 type: "POST", 19 dataType: "html", 20 data:formdata, 21 cache:false, 22 processData: false, 23 contentType: false, 24 }).done(function(data){ 25 $('.result').html(data); 26 }); 27 }); 28});

php

1<?php 2header("Content-type: text/html; charset=utf-8"); 3$type = filter_input( INPUT_POST, "type" ); 4$type_split = preg_split("/,/", $type); //,で区切って取って見ましたが動きませんでした。追記:配列にカンマ区切りでそれぞれのあたいは入るのですが、正常の検索されまでんでした。 5                        //下記のif文のところですと"チェックされてない"が表示されます。 6$type_implode = implode($type_split);//区切ったもの文字列にしたのですが"12"となってしまいうまく行きませんでした。追記:結果が"12"となってしまうため同じく"チェックされてない"が表示されます。 7 8$data = [ 9 "test"=>[ 10 [ 11 "type"=>"1", 12 "color"=>"red" 13 ], 14 [ 15 "type"=>"2" 16 "color"=>"red" 17 ], 18 [ 19 "type"=>"3" 20 "color"=>"blue" 21 ], 22 [ 23 "type"=>"4" 24 "color"=>"green" 25 ] 26 ] 27]; 28 29$result = array_filter($data["test"],function($x) use($type) { 30 return (is_null($type) || $x["type"] == $type); 31}); 32if ($result == null) { 33 print <<<eof 34 <div class="empty"> 35 <p>チェックされてない</p> 36 </div> 37eof; 38} else { 39 array_walk($result,function($x){ 40 print <<<eof 41 <p>{$x["type"]}</p> 42eof; 43}); 44} 45?>

試したこと

上記のコメントアウト部分のようにいろいろ試して見たのですが、
そもそも $type がどのような形であれば
複数のtypeがヒットするのでしょうか?
ご教示のほどよろしくお願いします。

追記
質問の趣旨が少し変わってしまうので指摘がありましたら別で質問いたします。

papinianusさんのご回答を元に項目がtype以外にも必要だったため

php

1$result = array_filter($data["test"],function($x) use($type,$color) { 2 return (is_null($type) || in_array($x["type"], $type_split, true)) && 3 (is_null($color) || in_array($x["color"], $color_split, true)); 4}); 5としましたが、この状態ですと全ての項目に当てはまっているものした表示されませんでした。 6例:カラー項目の青または緑のみを押した場合typeでいうと34を表示したいがcolorがチェックされていないため何も表示されない状態です。 7※htmlとphpの配列にcolorの項目を追記しています。

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

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

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

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

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

mather

2018/08/21 01:38

「動きませんでした」とある部分について、どんな値になるか期待していたのに対して実際にはどんな結果になったのか具体的に書いてください。
MeB

2018/08/21 01:51

matherさん 失礼しました。訂正と追記をしました。
guest

回答3

0

papinianusさんとほぼ同じですが、次のようにすることで判定できます。

php

1$result = array_filter($data["test"],function($x) use($type_split) { 2 return in_array($x["type"], $type_split, true); 3});

is_null($type) を取り除きましたが、これだけ個別にチェックして $data を全部返すようにして良いと思います。

ちなみに、 $result == null という判定も正確ではないと思います。空配列かどうかチェックしたほうが良いのではないでしょうか?

投稿2018/08/21 02:25

mather

総合スコア6753

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

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

MeB

2018/08/21 09:04

ご回答ありがとうございます。 仮にtypeの他にcolorがあった場合は true) && in_array... などのようにするのでしょうか? >is_null($type) を取り除きましたが、これだけ個別にチェック$data を全部返す $result =... の後に個別の処理を書くということでしょうか? 重ねての質問すみません。
mather

2018/08/22 00:54

> 仮にtypeの他にcolorがあった場合は それはフィルタしたい条件によると思います。 「typeがこの中のどれか」かつ「colorがこの中のどれか」となっている場合は AND条件になると思います。 しかし、ものすごく中途半端なコードでは認識が同じなのかわからないので僕からは「それで良い」とは言えません。 > >is_null($type) を取り除きましたが、これだけ個別にチェック$data を全部返す > $result =... の後に個別の処理を書くということでしょうか? いえ、自分で条件をよく見直してほしいのですが、 $type が指定されていない場合は実際には何もフィルタせずに全件出力してますよね。つまり、 array_filterそのものを実行する必要がないはずです。
guest

0

仕様としては1,2,3,4のどれか一つでもマッチすればよいということですか?
explodeしてin_arrayでいいかと思いますが、せっかくfilter_inputしているならこれでどうでしょうか?
(とりあえずajaxはおいておいて自分にpostしてあります)

PHP

1<?PHP 2$type = filter_input( INPUT_POST, "type" ,FILTER_VALIDATE_REGEXP,["options"=>["regexp"=>"/(^|,)[1-4](,|$)/"]]); 3if(!is_null($type)){ 4 if($type===false){ 5 print "not match"; 6 }else{ 7 print $type; 8 } 9} 10?> 11<form method="POST"> 12<label><input type="radio" name="type" value="1">1</label> 13<label><input type="radio" name="type" value="2,3,4">2,3,4</label> 14<label><input type="radio" name="type" value="4,5,6">4,5,6</label> 15<label><input type="radio" name="type" value="5,6,7">5,6,7</label> 16<label><input type="radio" name="type" value="20,30,40">20,30,40</label> 17<button type="submit" value="check">検索</button> 18</form>

投稿2018/08/21 02:20

yambejp

総合スコア114583

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

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

MeB

2018/08/21 09:09

ご回答ありがとうございます。 上記ですと"2"と"3"と"4"ではなく"2,3,4,"と取れてしましヒットしませんでした。 おそらく伝え方が悪かったのだと思います。すみません。
guest

0

ベストアンサー

$resultですが、$type_splitを使うときは、こういう書き方ではないかと思います。

php

1$result = array_filter($data["test"],function($x) use($type) { 2 return (is_null($type) || in_array($x["type"], $type_split, true)); 3});

$x["type"] == $type_splitでは文字列と配列を==で比較していることになり、正常に検索できません。

投稿2018/08/21 01:58

papinianus

総合スコア12705

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

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

MeB

2018/08/21 09:11

ご回答ありがとうございます。 上記の場合で 検索する項目がtype以外にもいつくかある場合は 同じ処理を(returnの部分)項目の個数文記述する感じで良いのでしょうか?
papinianus

2018/08/21 09:15 編集

それでいいんじゃないかと思います。`&& in_array($x["color"], $color_split, true)`とかを足すイメージですかね(もちろん配列なら、です) ||と&&を組み合わせるなら、()とかつけないと…
MeB

2018/08/21 09:20

ありがとうございます。 なん度もすみません。 いただいたコード部分を && にして記述したのですが チェック項目は複数あった場合全てをチェックしないと表示されない状態です。 理想はチェックした項目が全て当てはまって入れば該当項目を表示、 またチェックされていない項目があればそこはスルーして表示させたいのですが if ($result == null) {... の部分を直すべきでしょうか?
papinianus

2018/08/21 10:39

どこのどれを&&になさったのかわかりません。また、全てとはtypeとcolorのどの組み合わせのことを指していますか? できれば質問に追記していただけないですか?
MeB

2018/08/22 00:14

失礼しました。 追記いたしました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問