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

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

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

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

Q&A

解決済

2回答

1157閲覧

PHP 二次配列で特定条件のデータ抽出

megumi11222000

総合スコア11

PHP

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

0グッド

0クリップ

投稿2017/10/23 09:50

編集2017/10/23 09:50

|ID|Color1|Color2|Color3|
|:--|:--:|--:|
|1|red|red|red|
|2|red|green|green|
|3|red|green|green|
|4|red|green|blue|
|5|red|blue|blue|

PHP初心者です。

上記のような2次配列のデータに対し、
color1がred且つ、color2がgreen且つ、color3がgreenのデータを抽出し、
そのデータ数が知りたいです。(上記の例だと、ID:2,3の2データ)

.netですと、tableでcomputeがつかえたのですが、そういった関数はPHPにないのでしょうか。

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

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

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

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

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

guest

回答2

0

こういうことですか?

PHP

1$a=[ 2["ID"=>1,"Color1"=>"red","Color2"=>"red" ,"Color3"=>"red" ], 3["ID"=>2,"Color1"=>"red","Color2"=>"green","Color3"=>"green"], 4["ID"=>3,"Color1"=>"red","Color2"=>"green","Color3"=>"green"], 5["ID"=>4,"Color1"=>"red","Color2"=>"green","Color3"=>"blue" ], 6["ID"=>5,"Color1"=>"red","Color2"=>"blue" ,"Color3"=>"blue" ], 7]; 8 9$b=["Color1"=>"red","Color2"=>"green","Color3"=>"green"]; 10$c=array_filter($a,function($x) use($b){ 11 return $x["Color1"]===$b["Color1"]&&$x["Color2"]===$b["Color2"]&&$x["Color3"]===$b["Color3"]; 12}); 13 14print_r($c);

投稿2017/10/23 10:40

yambejp

総合スコア114736

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

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

退会済みユーザー

退会済みユーザー

2017/10/23 10:50

私のと違って ["ID"=>10,"Color1"=>"red","Color2"=>"green","Color3"=>"green","Color4"=>"green"] がこちらでは正になりますね。 どっちが正しい要件なんだろ。
megumi11222000

2017/10/23 11:07 編集

array_filterという関数があるんですね。検索してみましたところ、抽出条件に合致するデータを全て返す、とのことでしたので、上記例でいくと、ID:2とID:3が抽出でき、count($c)でデータ数2が取得できそうです。解決いたしました、有難うございます。 ご回答いただいたarray_filterの記載の仕方が初心者の私には何となくこんなことをしているのかな?ぐらいにしかわからなかったので調べてみたいと思います。 早期解決にご協力頂きまして大変ありがとうございました。
guest

0

ベストアンサー

配列の比較をするだけなので、関数って必要なんですかね?

php

1<?php 2function chk(array $array){ 3 $test = [ 4 'Color1' => 'red', 5 'Color2' => 'green', 6 'Color3' => 'green', 7 ]; 8 if(!($array === $test))return false; 9 return true; 10} 11$tmp= [ 12 [ 13 'Color1' => 'red', 14 'Color2' => 'red', 15 'Color3' => 'red', 16 ], 17 [ 18 'Color1' => 'red', 19 'Color2' => 'green', 20 'Color3' => 'green', 21 ], 22 [ 23 'Color1' => 'red', 24 'Color2' => 'green', 25 'Color3' => 'green', 26 ], 27 [ 28 'Color1' => 'red', 29 'Color2' => 'green', 30 'Color3' => 'blue', 31 ], 32 [ 33 'Color1' => 'red', 34 'Color2' => 'blue', 35 'Color3' => 'blue', 36 ], 37]; 38 39foreach ($tmp as $val) { 40 echo chk($val)?'Yes':'No'; 41 echo PHP_EOL; 42} 43//No 44//Yes 45//Yes 46//No 47//No

なんか要件を記載漏れしてないですか?

投稿2017/10/23 10:28

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

megumi11222000

2017/10/23 10:39

ご回答頂きまして有難うございます。$testでチェック配列を作る考え方は無かったので、大変参考になりました。echo chk()の部分で’Yes'をカウントすることで、欲しいデータ数2がGet出来るかと思います。 上記にて要件として全く問題がないのですが、.netの知識があったものですから、foreachでまわすことなく、関数の駆使で一発で取得できる方法はないのかなと思っておりました。(↓のような感じです) cnt = tmp.Compute("Count(’ID’)", color1=red AND color2=green AND color3=green) //cnt:2
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問