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

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

新規登録して質問してみよう
ただいま回答率
85.48%
多次元配列

1次元配列内にさらに配列を格納している配列を、多次元配列と呼びます。

PHP

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

検索

検索は、あるデータの集まりの中から 目的のデータを見つけ出すことです。

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

Q&A

解決済

3回答

4494閲覧

【PHP】多次元配列の値の複数検索の方法で良い方法があれば教えてください!

akito-miyazato

総合スコア5

多次元配列

1次元配列内にさらに配列を格納している配列を、多次元配列と呼びます。

PHP

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

検索

検索は、あるデータの集まりの中から 目的のデータを見つけ出すことです。

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

0グッド

0クリップ

投稿2022/05/26 08:13

下記のような多次元配列があります。

PHP

1$arrays = [ 2 0 => [ 3 'エリアID' => 1, 4 '名前' => 'Tanaka', 5 '建物種別' => 2, 6 ], 7 1 => [ 8 'エリアID' => 1, 9 '名前' => 'Yamada', 10 '建物種別' => 3, 11 ], 12 2 => [ 13 'エリアID' => 1, 14 '名前' => 'Satou', 15 '建物種別' => 4, 16 ], 17 3 => [ 18 'エリアID' => 2, 19 '名前' => 'Hayashi', 20 '建物種別' => 1, 21 ], 22 4 => [ 23 'エリアID' => 2, 24 '名前' => 'Hasegawa, 25 '建物種別' => 2, 26 ], 27];

こちらの多次元配列から、エリアIDが1で、建物種別が3の、名前を取得したいと思っています。
私が試してみたコードは下記になります。

PHP

1//まず、array_columnとarray_keysを使って、エリアIDが1の配列のキーリストを取得 2$key_list = array_keys( array_column( $arrays, 'エリアID'), 1); 3 4//キーリストをループで回し、エリアIDが1の多次元配列を新たに作成 5$new_arrays = array(); 6foreach($key_list as $key){ 7 $new_arrays[] = $arrays[$key]; 8} 9 10// 11$key = array_search( 3, array_column( $new_arrays, '建物種別')); 12print_r($new_arrays[$key]); 13//Yamada

何かもっとコードが短くなる良い方法はありますでしょうか。
例えばこの関数使えば1発みたいなのがあればご教示いただきたいです。

宜しくお願いいたします。

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

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

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

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

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

guest

回答3

0

ベストアンサー

php

1$name = current(array_filter($arrays, 2 fn($v) => $v['エリアID'] == 1 && $v['建物種別'] == 3))['名前']; 3 4echo $name; 5 6# 7Yamada

投稿2022/05/26 08:56

melian

総合スコア19714

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

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

akito-miyazato

2022/05/26 09:34

回答のコードを試してみましたが、アロー関数のあたりで構文エラーが出ます。 ちなみにPHPはバージョン7.3です。 バージョン7.3ではエラーになってしまうのでしょうか。
melian

2022/05/26 09:40

はい、アロー関数は PHP 7.4 から導入されました。7.3 の場合は以下の様になります。 $name = current(array_filter($arrays, function($v) {return $v['エリアID'] == 1 && $v['建物種別'] == 3;} ))['名前'];
guest

0

PHP

1<?PHP 2$a = [ 3 [ 4 'エリアID' => 1, 5 '名前' => 'Tanaka', 6 '建物種別' => 2, 7 ], 8 [ 9 'エリアID' => 1, 10 '名前' => 'Yamada', 11 '建物種別' => 3, 12 ], 13 [ 14 'エリアID' => 1, 15 '名前' => 'Satou', 16 '建物種別' => 4, 17 ], 18 [ 19 'エリアID' => 2, 20 '名前' => 'Hayashi', 21 '建物種別' => 1, 22 ], 23 [ 24 'エリアID' => 2, 25 '名前' => 'Hasegawa', 26 '建物種別' => 2, 27 ], 28 ]; 29$b=[ 30 'エリアID' => 1, 31 '建物種別' => 3, 32 ]; 33 34$res=implode(",",array_map(function($x){ 35 return $x["名前"]; 36},array_filter($a,function($x) use($b){ 37 foreach($b as $key=>$val){ 38 if($x[$key]!==$val) return false; 39 } 40 return true; 41}))); 42 43print_r($res);

名前を返すように調整

投稿2022/05/26 08:27

編集2022/05/26 09:16
yambejp

総合スコア114779

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

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

yambejp

2022/05/26 09:18

エリアIDが1、建物種別が3の要素が1つだとは限りませんので 戻り値配列にするか、カンマ区切りなどの文字列にする必要があります
guest

0

42であなたの問題は解決します。googleで検索したので間違いないです。
参考:The Answer to the Ultimate Question of Life, the Universe, and Everything is 42

投稿2022/05/26 08:25

can110

総合スコア38262

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問