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

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

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

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

Q&A

解決済

1回答

586閲覧

array_filterで一致を削除

KOMANETI

総合スコア16

PHP

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

0グッド

0クリップ

投稿2020/10/29 05:15

###実現したいこと
$datasから$unset_idに一致したものを削除し、$resultを得たいです。
###ソースコード

$unset_id = 2; $datas = [ ['id'=>1,'name'=>'a'], ['id'=>2,'name'=>'b'], ['id'=>3,'name'=>'c'], ]; $result = [ ['id'=>1,'name'=>'a'], ['id'=>3,'name'=>'c'], ];

###試したこと
以下でarray_filterに挑戦中ですがうまくできません。

$unset_id = 2; $datas = [ ['id'=>1,'name'=>'a'], ['id'=>2,'name'=>'b'], ['id'=>3,'name'=>'c'], ]; $result = array_filter($datas, function($data) { if( $data['id'] === $unset_id ){ unset( $datas[$k] ); } }); var_dump($result);

useを使ってみたりしたのですが、、、うーんです。

$result = array_filter($datas, function($data) use($unset_id) { if( $data['id'] === $unset_id ){ unset( $datas[$k] ); } }); var_dump($result);

自分のスキルでは以下のループでの実現ですが、上のようにarray_filterを使うなどして少し高級な(?)やり方を覚えたいのです。宜しくお願い致します。

foreach ( $datas as $k => $data ) { if( $data['id'] === $unset_id ){ unset( $datas[$k] ); } } $result = array_values($datas); var_dump($result);

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

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

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

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

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

guest

回答1

0

ベストアンサー

array_filterに渡す関数でtrue/falsereturnしましょう。

【PHP: array_filter - Manual】
https://www.php.net/manual/ja/function.array-filter.php

callback 関数によりフィルタ処理が行われた array の全ての要素を含む配列を返します。 callback 関数が TRUE を返した場合、 array の現在の値が結果の配列に入ります。

投稿2020/10/29 05:20

kei344

総合スコア69606

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

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

KOMANETI

2020/10/29 05:27

なるほどこうですね!?ありがとうございます。 $result = array_filter($datas, function($data) use($unset_id) { return $data['id'] !== $unset_id; }); $result = array_values($datas); //【※】 var_dump($result); ちなみに上の【※】ですが、これはarray_filterの中では実行できないでしょうか? なんとなく1つにまとめたいといいますか…
kei344

2020/10/29 06:28

機能が違うのでできません。 array_values(array_filter($datas, function($data) use($unset_id) {/*略*/}));とか、まとめて書くことはできます。
KOMANETI

2020/10/29 06:35

なるほど。ご説明ありがとうございます。
KOMANETI

2020/10/29 10:39

こんにちは。気になって以下でそれぞれを計測しました↓ どうやら 削除対象が配列の前半にある場合、break; を付ければループの方が早かったので、素直にそうしたいと思います。 ■結果 loop : 0.00068211555480957 秒 filter : 0.0013670921325684 秒 ■結果を出力するコード <?php // 削除対象のデータを生成 $datas = []; for ($i = 0; $i < 10000; $i++){ $datas[] = ['id'=>$i,'name'=>'number_'.$i]; } // 削除 $unset_id = 3; // loop() の時間 $time_start = microtime(true); loop($datas,$unset_id); $time = microtime(true) - $time_start; echo "loop : {$time} 秒".PHP_EOL; // filter() の時間 $time_start = microtime(true); filter($datas,$unset_id); $time = microtime(true) - $time_start; echo "filter : {$time} 秒".PHP_EOL; // loop() を実行 function loop($datas,$unset_id){ foreach ( $datas as $k => $data ) { if( $data['id'] === $unset_id ){ unset( $datas[$k] ); break; } } return array_values($datas); } // filter() を実行 function filter($datas,$unset_id){ $result = array_filter($datas, function($data) use($unset_id) { return $data['id'] !== $unset_id; }); return array_values($datas); }
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問