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

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

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

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

Q&A

解決済

2回答

933閲覧

条件に一致しない多次元配列の削除

aae_11

総合スコア178

PHP

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

0グッド

0クリップ

投稿2019/07/28 22:53

編集2019/07/28 22:53

下記のコードなのですが、$item_listのitem_idと$item_info_listのidが一致していなかった場合、$item_listの中の配列を削除することを想定したコードです。
理想としましては、$item_listはitem_idが33を持つ配列だけを所有させたいです。

$item_list = array( 0 => array('item_id' => 33,'amount' => 2));

最終的には、$item_listは上記なような形にしたいです。

php

1<?php 2// Your code here! 3$item_list = array( 4 0 => array( 'item_id' => 23,'amount' => 11), 5 1 => array( 'item_id' => 25,'amount' => 1), 6 2 => array( 'item_id' => 24,'amount' => 1), 7 3 => array( 'item_id' => 28,'amount' => 1), 8 4 => array( 'item_id' => 27,'amount' => 1), 9 5 => array( 'item_id' => 33,'amount' => 2), 10); 11 12$item_info_list = array( 13 14 0 => array('id' => 33,'name' => 'テスト','price' => 100,'img' => 'img/test','status' => 0) 15 16); 17 18foreach($item_list as $value){ 19 20 foreach($item_info_list as $info_list) 21 // var_dump($info_list['id']); 22 // var_dump($value['item_id']); 23 24 if($value['item_id'] === $info_list['id']){ 25 echo 'ok'; 26 unset($value); 27 $item_list = array_values($item_list); 28 } 29 var_dump($item_list); 30 31} 32 33?>

上記のような方法ではうまくいかなかった為、良い方法がありましたら、教えてください。
よろしくお願いします。

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

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

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

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

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

guest

回答2

0

ベストアンサー

動作確認のためには、複数×複数の方が良いような気がしたので、ちょっと変えてみました。

<?php $item_list = array( 0 => array('item_id' => 23, 'amount' => 11), 1 => array('item_id' => 25, 'amount' => 1), 2 => array('item_id' => 24, 'amount' => 1), 3 => array('item_id' => 28, 'amount' => 1), 4 => array('item_id' => 27, 'amount' => 1), 5 => array('item_id' => 33, 'amount' => 2), ); $item_info_list = array( 0 => array('id' => 33, 'name' => 'テスト', 'price' => 100, 'img' => 'img/test', 'status' => 0), 1 => array('id' => 24, 'name' => 'テスト2', 'price' => 200, 'img' => 'img/test', 'status' => 1) ); $item_list = array_filter($item_list, function($x) use ($item_info_list) { return in_array($x['item_id'], array_column($item_info_list, 'id')); }); var_dump($item_list);

投稿2019/07/28 23:47

takepan1973

総合スコア821

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

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

aae_11

2019/07/29 01:48

ご回答ありがとうございます。 array_fileterの使い方に関しまして、大変勉強になりました。 1点だけ、お聞きしたいことがあるのですが、 「return in_array($x['item_id'], array_column($item_info_list, 'id'));」 こちらの行に関しましては、returnにより、TRUEだった$item_listの行を配列にして返している、といった解釈で合っていますでしょうか?
takepan1973

2019/07/29 01:55

うーん、配列にして返している、というとちょっと違う気がします。 trueだったら残す、falseだったら消す、という感じですかね。 array(2) { [2]=> array(2) { ["item_id"]=> int(24) ["amount"]=> int(1) } [5]=> array(2) { ["item_id"]=> int(33) ["amount"]=> int(2) } } var_dumpの結果を見ると分かりますが、添字「2」「5」(3番目と6番目)が残っているのが分かるかと思います。
aae_11

2019/07/29 02:06 編集

ご返信ありがとうございます。 確かに残す、消す、といった感じになっていますね。勉強になります。 すみません。一点だけといったのですが、プラス一点少し、疑問な点がございまして... 「in_array($x['item_id'],」こちらでitem_idを指定しているのですが、多次元配列の為、$x[0]['item_id']のように指定しなければ、多次元配列の場合はキーを指定できないものと思っていたのですが、何故「$x['item_id']」のような指定の仕方が可能なのでしょうか...?
takepan1973

2019/07/29 05:15

array_filterの時点で配列を対象にしており、処理の対象は「各要素」です。 なので、 $x に入るのは、 $item_list[0]、$item_list[1]、 …… 、$item_list[5] になります。 ということで、 $x['item_id']が指すのは $item_list[0]['item_id']、… なので、添字は不要なのです。
guest

0

「条件に一致しない多次元配列の削除」を「条件に一致した配列の抽出」と読み替えれば、array_filter() で実装できます。

投稿2019/07/28 23:10

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

aae_11

2019/07/29 01:32

array_filter便利ですね。今まで使ったことがなかったのですが、配列を操作する際は、重宝しそうです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問