🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
PHP

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

Q&A

2回答

2265閲覧

PHP連想配列で、複数の値を指定して、一致する要素を削除する方法

natsunoomoide

総合スコア8

PHP

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

0グッド

1クリップ

投稿2019/09/24 10:46

###実現したいこと
下記$arrから、s_id1で、a_id777の要素を削除したいです。

(正確に言いますと、削除したい値は関数del()の引数で指定します。)

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

$arr = [ 'up'=>[ [ 's_id'=>1, 'a_id'=>777, 'date'=>2019 ], // 削除したい [ 's_id'=>2, 'a_id'=>777, 'date'=>2019 ], [ 's_id'=>1, 'a_id'=>111, 'date'=>2019 ], [ 's_id'=>3, 'a_id'=>777, 'date'=>2019 ], ], 'down'=>[ [ 's_id' =>1, 'a_id'=>333, 'date'=>2019 ] ] ];

###試したこと
まず普通にループとifで試しましたが、unsetをどう指定するのかで行き詰りました。下記です。

function del( $arr, $action, $s_id, $a_id ){ foreach( $arr[$action] as $val ){ if( $val['s_id']==$s_id && $val['a_id']==$a_id ){ unset( ); // どう指定すれば…? } } return $arr; }

続いてarray_searchを使ってみたのですが、s_ida_idという複数の値について指定する方法がいまいちわからず、こちらも行き詰っています。

function del( $arr, $action, $s_id, $a_id ){ if(($key = array_search($s_id, $arr[$action])) !== false) { if(($key = array_search($a_id, $arr[$action])) !== false) { unset($arr[$key]); } } return $arr; }

いずれかの方法について修正方法を、またはいずれも見当外れでしたら正しい方法を教えて頂けましたら幸いです。

宜しくお願い致します。

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

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

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

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

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

guest

回答2

0

一応やりたいことが実現できる関数は用意されています。
が、個人的には一致しないものを新しい配列として作り return する!の一択です。

与えられた配列をどうしても加工したい場合、以下の中から適当なものを探してください。
配列 関数

投稿2019/09/24 10:58

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

natsunoomoide

2019/09/24 12:42 編集

一択とのこと、よろしければそのお心をお聞かせいただけませんでしょうか。「その方が汎用性の高い」とか、「質問の方法では弊害が起こりやすい」などの理由がございましたら是非仰る選択肢にしたいと思いますが、当方PHP経験が浅くいまいちイメージがわきません。
退会済みユーザー

退会済みユーザー

2019/09/24 17:10

回している配列を途中でいじるのがイヤって理由です。 ちゃんと理解していないと碌な事になりません。 あと、見通しが悪くなります。
退会済みユーザー

退会済みユーザー

2019/09/24 17:13

配列関数の中には、回している配列自身を変更することを目的としたものがいくつかあります。 そういったものを使用すると見通しは良くなります。
guest

0

PHP

1<?PHP 2$arr = [ 3 'up'=>[ 4 [ 's_id'=>1, 'a_id'=>777, 'date'=>2019 ], // 削除したい 5 [ 's_id'=>1, 'a_id'=>777, 'date'=>2019 ], // 削除したい 6 [ 's_id'=>1, 'a_id'=>777, 'date'=>2019 ], // 削除したい 7 [ 's_id'=>2, 'a_id'=>777, 'date'=>2019 ], 8 [ 's_id'=>1, 'a_id'=>777, 'date'=>2019 ], // 削除したい 9 [ 's_id'=>1, 'a_id'=>111, 'date'=>2019 ], 10 [ 's_id'=>1, 'a_id'=>777, 'date'=>2019 ], // 削除したい 11 [ 's_id'=>3, 'a_id'=>777, 'date'=>2019 ], 12 ], 13 'down'=>[ 14 [ 's_id'=>1, 'a_id'=>777, 'date'=>2019 ], // 削除したい 15 [ 's_id'=>1, 'a_id'=>333, 'date'=>2019 ], 16 [ 's_id'=>1, 'a_id'=>777, 'date'=>2019 ], // 削除したい 17 [ 's_id'=>1, 'a_id'=>777, 'date'=>2019 ], // 削除したい 18 ] 19]; 20 21foreach($arr as &$arr1){ 22 foreach($arr1 as $key=>$arr2){ 23 if($arr2["s_id"]==1 and $arr2["a_id"]==777){ 24 unset($arr1[$key]); 25 }; 26 } 27} 28print_r($arr);

投稿2019/09/24 10:59

yambejp

総合スコア116661

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

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

natsunoomoide

2019/09/24 14:32 編集

迅速なご回答をどうもありがとうございます。 upとdownを指定するにはどうしたらよろしいでしょうか。(upとdownの両方から削除するというケースはなく、指定された一方からの削除だけを考えておりました。)
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問