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

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

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

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

Q&A

解決済

1回答

198閲覧

PHP 配列データの再構築

Fetherion

総合スコア60

PHP

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

0グッド

0クリップ

投稿2018/07/04 06:02

編集2018/07/04 07:46

###はじめに
データベースより抽出したデータにおいて、そのデータを再構築していきたいので、質問いたします。

###デモデータ1

php

1$demo[] = ['id' => '1111', 'number' => 1]; 2$demo[] = ['id' => '1111', 'number' => 2];

※とりあえずのデータです。

###やりたいこと1

  • 配列内の'number'が必ず1~4が必ずあるような配列にしたい
  • numberに関して1~4は一つずつしか存在しない

###とりあえず書いてみたコード1

php

1for($i = 0; $i < 4; $i++) { 2 $num = $i + 1; 3 $key = array_search($num, array_column($demo, 'number')); 4 if($key === false) { 5 $demo[] = ['id' => $demo[0]['id'], 'number' => $num]; 6 } 7}

※あくまでもデータがあるというのが前提にしています。

上記までで、実は一応ではありますが、配列としてはできました。
下記はvar_dump()の結果です

php

1array(4) { 2 [0]=> 3 array(2) { 4 ["id"]=> 5 string(4) "1111" 6 ["number"]=> 7 int(1) 8 } 9 [1]=> 10 array(2) { 11 ["id"]=> 12 string(4) "1111" 13 ["number"]=> 14 int(2) 15 } 16 [2]=> 17 array(2) { 18 ["id"]=> 19 string(4) "1111" 20 ["number"]=> 21 int(3) 22 } 23 [3]=> 24 array(2) { 25 ["id"]=> 26 string(4) "1111" 27 ["number"]=> 28 int(4) 29 } 30}

###デモデータ2

php

1$demo[] = ['id' => '1111', 'number' => 1]; 2$demo[] = ['id' => '1111', 'number' => 5];

###やりたいこと2
考え方などはやりたいこと1などと基本同じですが、number = 5については配列内から除去しておきたい。

###とりあえず書いてみたコード2

php

1for($i = 0; $i < 4; $i++) { 2 $num = $i + 1; 3 $key = array_search($num, array_column($demo, 'number')); 4 if($key === false) { 5 $demodemo[] = ['id' => $demo[0]['id'], 'number' => $num]; 6 } else { 7 $demodemo[] = $demo[$i]; 8 } 9}

###やっと質問の部分に入ります
デモデータにおいて、numberが順番に入っているわけではない場合があります。例えば下記

php

1$demo[] = ['id' => '1111', 'number' => '1']; 2$demo[] = ['id' => '1111', 'number' => '3'];

こちらをvar_dump()すると当然下記のようになります

php

1array(2) { 2 [0]=> 3 array(2) { 4 ["id"]=> 5 string(4) "1111" 6 ["number"]=> 7 string(1) "1" 8 } 9 [1]=> 10 array(2) { 11 ["id"]=> 12 string(4) "1111" 13 ["number"]=> 14 string(1) "3" 15 } 16}

そして、考え方は同じではありますが、すでにあるデータはそのまま残したいのでやりたいこと2で書いたコードの方が当てはまると考えました。
しかし、、、この場合だと少し結果が意図したものにならず、わからなくなってきています。
見分けをつけるために今回は抽出したデータのnumberはstringにしています。

###エラー結果1

php

1Notice: Undefined offset: 2 in /in/TRC3Z on line 15 2array(4) { 3 [0]=> 4 array(2) { 5 ["id"]=> 6 string(4) "1111" 7 ["number"]=> 8 string(1) "1" 9 } 10 [1]=> 11 array(2) { 12 ["id"]=> 13 string(4) "1111" 14 ["number"]=> 15 int(2) 16 } 17 [2]=> 18 NULL 19 [3]=> 20 array(2) { 21 ["id"]=> 22 string(4) "1111" 23 ["number"]=> 24 int(4) 25 } 26}

まぁ当然かな、、、と思います。
データとしては$demodemo[1]にはFALSE側の条件が当てはまってしまいデータが入り、$demo[1]のデータがずれて$demodemo[2]に入らないといけないけど、うまくいっていないというのはなんとなくわかるのですが、、、

では、この辺りをうまく下記の結果のようにするには?

php

1array(4) { 2 [0]=> 3 array(2) { 4 ["id"]=> 5 string(4) "1111" 6 ["number"]=> 7 string(1) "1" 8 } 9 [1]=> 10 array(2) { 11 ["id"]=> 12 string(4) "1111" 13 ["number"]=> 14 int(2) 15 } 16 [2]=> 17 array(2) { 18 ["id"]=> 19 string(4) "1111" 20 ["number"]=> 21 string(1) "3" 22 } 23 [3]=> 24 array(2) { 25 ["id"]=> 26 string(4) "1111" 27 ["number"]=> 28 int(4) 29 } 30}

そして、デモデータが下記だった場合

php

1$demo[] = ['id' => '1111', 'number' => '1']; 2$demo[] = ['id' => '1111', 'number' => '3']; 3$demo[] = ['id' => '1111', 'number' => '5'];

無視するようにしたとしても、上記の書いてみたコードではnumber = 5の部分が配列に組み込まれる結果となってしまっているので、、、合わせてどのようなコードに修正をすると、うまくいくのか?

長くなり、説明が不足している部分等あると思いますので、ご指摘ください。

よろしくお願いいたします。


###今回の解決コード
ご指摘、回答していただき大変ありがとうございます。
今回は下記のような形で完了と致しましたので、こちらにまとめとして記載しておきます。

php

1// デモデータ 2$demo[] = ['id' => '1111', 'number' => '1']; 3$demo[] = ['id' => '1111', 'number' => '3']; 4$demo[] = ['id' => '1111', 'number' => '5']; 5 6$numbers = array_column($demo, 'number'); 7$filter = [1, 2, 3, 4]; 8 9// 配列内のnumberの値が5だった場合その配列自体は必要ないものとしました。 10foreach($demo as $key => $val) { 11 if($demo[$key]['number'] === '5') { 12 unset($demo[$key]); 13 } 14} 15 16// 今回回答していただいた部分のコードです 17for($i = 1; $i <= 4; $i++) { 18 if(!in_array($i, $filter)) { 19 array_splice($demo, $i, 1); 20 continue; 21 } 22 if(!in_array($i, $numbers)) { 23 $demo[] = ['id' => $demo[0]['id'], 'number' => $i]; 24 } 25} 26 27 28 29var_dump($demo);

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2018/07/04 06:07

SQLで必要なデータを取ってくれば済むことなのに、わざわざPHPで加工しなければいけない理由があるのですか?
Fetherion

2018/07/04 06:14

確かに必要なデータを取ってくるという部分であれば、それが上記のデモデータの状態で、それだけで確かに良い部分もあるのですが、ちょっと表示の際などで、データの個数を揃えるという感じでしょうか?そうなった方が都合が良いと感じたので、今回質問させていただきました。
guest

回答1

0

ベストアンサー

やりたいこと的に多分こうでしょうか(文法チェックしてないので悪しからず)

php

1$numbers = array_column('number'); 2$filter = [1, 2, 3, 4]; 3 4for($i = 1; $i <= 4; $i++) { 5 if(!in_array($i, $filter) { 6 array_splice($demo, $i, 1); 7 continue; 8 } 9 if(!in_array($i, $numbers)) { 10 $demo[] = ['id' => $demo[0]['id'], 'number' => $i]; 11 } 12}

投稿2018/07/04 06:22

kuwako

総合スコア387

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

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

Fetherion

2018/07/04 07:41

回答ありがとうございました。 number = 1 -> 3のように飛び飛びな配列であっても、希望する形にはなりました。 number = 5などの場合に多少思った挙動ではなかったのですが、そのあたりは配列の削除によりなんとかできました。 ありがとうございます!
kuwako

2018/07/05 01:26 編集

お役に立ててよかったです!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問