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

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

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

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

Q&A

解決済

2回答

1148閲覧

PHPで配列の検索について

ssk

総合スコア332

PHP

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

0グッド

1クリップ

投稿2017/09/03 15:14

編集2017/09/03 15:25

###前提・実現したいこと
PHPで2つの配列から検索を行い、新しい配列を作成したいです。
具体的には、$clumnArrにある値を$recipeArrから探して、
あれば、$Arrに格納していく。という具合です。

###該当のソースコード

PHP

1//$clumnArrの中身 2[ 3 (int) 0 => 'id', 4 (int) 1 => 'clumn01', 5 (int) 3 => 'clumn03', 6] 7 8//$recipeArrの中身 9[ 10 'hoge' => [ 11 ' id' => 'ID' 12 'clumn01' => 'ピーマン' 13 ], 14 'test' => [ 15 'clumn01' => '人参', 16 'clumn02' => '玉ねぎ', 17 'clumn03' => 'キャベツ', 18 ], 19]

###検索後に生成する新しい配列

PHP

1$Arr = [ 2'hoge' => [ 3 'id' => 'ID', 4 'clumn01' => 'ピーマン', 5], 6'test' => [ 7 'clumn03' => 'キャベツ' 8] 9]

###補足情報(言語/FW/ツール等のバージョンなど)
PHP ver7.1

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

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

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

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

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

kei344

2017/09/03 15:34

ご自身で試されたコードを質問文に追記し、「何」が「どのように」わからないのか、コードのどの部分で詰まっているのかなどを具体的に追記されたほうが回答が望めると思います。
ssk

2017/09/03 16:15

ありがとうございます。情報を追記いたします。
guest

回答2

0

ベストアンサー

この質問の問題を解決しなければいけないような事態に陥る前に設計を見直したほうが良いと思います。
質問ではキーが重複していて、$recipeArr['hoge']['clumn01']なのか$recipeArr['test']['clumn01']なのかあいまいです。

拡張性を考えれば「連想配列の位置をきちんと記録した上で、その位置を使って連想配列を検索する」としたほうがシンプルですし、拡張もしやすいかと思います。
好みの問題なのかもしれませんが。。。

答えが「設計を見直す」だと面白くないので真剣に考えてみました。
下記コードの関数を共通クラスのメソッドにすれば、ある程度拡張性もあるかと思います。(引数の条件をもっときちんと書かないといけないと思いますが)

php

1$clumnArr = [ 2 0 => 'id', 3 1 => 'clumn01', 4 3 => 'clumn03', 5]; 6 7$recipeArr = [ 8 'hoge' => [ 9 'id' => 'ID', 10 'clumn01' => 'ピーマン', 11 ], 12 'test' => [ 13 'clumn01' => '人参', 14 'clumn02' => '玉ねぎ', 15 'clumn03' => 'キャベツ', 16 ], 17]; 18 19/** 20 * 配列のキーの位置を探索 21 * 22 * @param string $search 探すキー 23 * @param array $array 連想配列 24 * @return string 「キー1.キー2...」形式の文字列でキーの位置を返す 25 */ 26function array_search_keys ($search, array $array) 27{ 28 $key = array_key_exists($search, $array) ? $search : false; 29 $keys = []; 30 31 if ($key === false) { 32 foreach ($array as $k => $v) { 33 if (is_array($v) && null !== $r = array_search_keys($search, $v)) { 34 $keys = [$k, $r]; 35 break; 36 } 37 } 38 $key = count($keys) ? implode('.', $keys) : false; 39 } 40 41 return $key === false ? null : $key; 42} 43 44/** 45 * 連想配列から指定のキー値を取得 46 * 47 * @param array $array 連想配列 48 * @param string $key キー(キー1.キー2...ドット区切りの文字列) 49 * @return array 指定キーの連想配列 50 */ 51function array_get (array $array, $key) 52{ 53 if (array_key_exists($key, $array)) { 54 return $array[$key]; 55 } 56 57 foreach (explode('.', $key) as $k) { 58 if (array_key_exists($k, $array)) { 59 $array = $array[$k]; 60 } 61 } 62 63 return $array; 64} 65 66/** 67 * 指定のキーと値で連想配列を作成 68 * 69 * @param array $array 配列の参照値 70 * @param string $key キー(キー1.キー2...ドット区切りの文字列) 71 * @param mixed $value72 */ 73function array_set (array &$array, $key, $value = null) 74{ 75 $keys = explode('.', $key); 76 77 while (count($keys) > 1) { 78 $key = array_shift($keys); 79 80 if (! isset($array[$key]) || ! is_array($array[$key])) { 81 $array[$key] = []; 82 } 83 84 $array =& $array[$key]; 85 } 86 87 $array[array_shift($keys)] = $value; 88} 89 90 91$Arr = []; 92 93foreach ($clumnArr as $search) { 94 $key = array_search_keys($search, $recipeArr); 95 $value = array_get($recipeArr, $key); 96 array_set($Arr, $key, $value); 97} 98 99echo '<pre>'; 100print_r($Arr); 101echo "\n"; 102echo '</pre>';

投稿2017/09/05 11:39

Tomak

総合スコア1652

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

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

ssk

2017/10/19 10:52

Tomak様 大変、お返事が遅くなってしまい申し訳ございません。 提示していただいたコードを参考に試しながら考え、、、、やはり設計を見直すことにしました。 サンプルコードのご提供、心より感謝申し上げます。
guest

0

PHP

1$clumnArr = [ 2 'id', 3 'clumn01', 4 'clumn02', 5]; 6 7$recipeArr = [ 8 'hoge' => [ 9 'id' => 'ID', 10 'clumn01' => 'ピーマン', 11 ], 12 'test' => [ 13 'clumn01' => '人参', 14 'clumn02' => '玉ねぎ', 15 'clumn03' => 'キャベツ', 16 ], 17]; 18 19$Arr = []; 20foreach ($recipeArr as $key1 => $value1) { 21 foreach ($value1 as $key2 => $value2) { 22 for($i = 0; $i < count($clumnArr); $i++) { 23 if ($key2 == $clumnArr[$i]) { 24 $Arr[$key1][$key2] = $value2; 25 } 26 } 27 } 28} 29 30print_r($Arr);

やりたいことは、こういうことでしょうか?
参考になればと思います。

※質問の際、自分が試したコードを載せておくといいと思います。

投稿2017/09/03 17:30

alone.mk2

総合スコア58

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

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

ssk

2017/10/19 10:53

alone.mk2様 大変、お返事が遅くなってしまい申し訳ございません。 サンプルコード、ありがとうございます。 皆様かの助言から 設計を見直すことにしました。 ご回答、誠にありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問