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

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

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

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

Q&A

解決済

4回答

2589閲覧

foreachで重複しているテキストを削除したい

退会済みユーザー

退会済みユーザー

総合スコア0

PHP

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

0グッド

0クリップ

投稿2019/08/05 12:57

前提・実現したいこと

ここに質問の内容を詳しく書いてください。
初めてご質問させていただきます。

質問の内容についてPHPのforeachで重複しているテキストを削除したいです。
参考サイトを元にコードを書いてみたのですが、削除したくないテキストも削除されてしまいます。
どのように修正をしたらいいのか分からず手詰まり状態です。

是非ともご教示いただければと思います。

発生している問題・エラーメッセージ

HTML

1<h2>台東区</h2> 2<p>浅草寺</p> 3 4<h2>墨田区</h2> 5<p>江戸東京博物館</p> 6 7<h2>千代田区</h2> 8<p>東京駅</p> 9 10<h2>中央区</h2> 11<p>歌舞伎座</p>

該当のソースコード

PHP

1 $variable = [ 2 ['id' => 1, 'location' => '台東区', 'name' => '浅草寺'], 3 ['id' => 2, 'location' => '台東区', 'name' => '今戸神社'], 4 ['id' => 3, 'location' => '台東区', 'name' => '東京国立博物館'], 5 ['id' => 4, 'location' => '墨田区', 'name' => '江戸東京博物館'], 6 ['id' => 5, 'location' => '墨田区', 'name' => '東京スカイツリー'], 7 ['id' => 6, 'location' => '千代田区', 'name' => '東京駅'], 8 ['id' => 7, 'location' => '千代田区', 'name' => '皇居'], 9 ['id' => 8, 'location' => '中央区', 'name' => '歌舞伎座'], 10]; 11 12$tmp = []; 13$uniques = []; 14foreach ($variable as $value){ 15 if (!in_array($value['location'], $tmp)) { 16 $tmp[] = $value['location']; 17 $uniques[] = $value; 18 } 19} 20foreach($uniques as $unique){ 21 echo '<h2>'.$unique['location'].'</h2>'; 22 echo '<p>'.$unique['name'].'</p>'; 23}

試したこと

こちらのサイトを参考にしましたが、例えば「台東区」の「浅草寺」は表示されますが他の「今戸神社」「東京国立博物館」が表示されなくなってしまいます。

連想配列中の重複したレコードを削除する

下記が実現したい事です。

HTML

1<h2>台東区</h2> 2<p>浅草寺</p> 3<p>今戸神社</p> 4<p>東京国立博物館</p> 5 6<h2>墨田区</h2> 7<p>江戸東京博物館</p> 8<p>東京スカイツリー</p> 9 10<h2>千代田区</h2> 11<p>東京駅</p> 12<p>皇居</p> 13 14<h2>中央区</h2> 15<p>歌舞伎座</p>

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

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

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

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

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

guest

回答4

0

「テキストを削除したい」と「下記が実現したい事(表示)」、
どちらが最終目的なのか分かりませんが。

表示を優先するなら下記コードで出来ますね。
(locationごとにデータが固まっていなくてもOK)

<?php $variable = [ ['id' => 1, 'location' => '台東区', 'name' => '浅草寺'], ['id' => 2, 'location' => '台東区', 'name' => '今戸神社'], ['id' => 3, 'location' => '台東区', 'name' => '東京国立博物館'], ['id' => 4, 'location' => '墨田区', 'name' => '江戸東京博物館'], ['id' => 5, 'location' => '墨田区', 'name' => '東京スカイツリー'], ['id' => 6, 'location' => '千代田区', 'name' => '東京駅'], ['id' => 7, 'location' => '千代田区', 'name' => '皇居'], ['id' => 8, 'location' => '中央区', 'name' => '歌舞伎座'], ]; $arr = []; foreach ($variable as $v) { $arr[$v['location']][] = $v['name']; } foreach ($arr as $location => $tmp) { echo "<h2>{$location}</h2>" . PHP_EOL; foreach ($tmp as $name) { echo "<p>{$name}</p>" . PHP_EOL; } echo PHP_EOL; }

投稿2019/08/05 23:39

takepan1973

総合スコア821

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

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

退会済みユーザー

退会済みユーザー

2019/08/06 03:26

ご回答ありがとうございます。 質問内容が分かりにくくて済みません。 重複しているlocationテキストの一部を削除したいという意味でした。 locationの順序関係なく表示できてとても参考になります。 ありがとうございました。
guest

0

ベストアンサー

locationの順序が保障されているなら。

PHP

1$variable = [ 2 ['id' => 1, 'location' => '台東区', 'name' => '浅草寺'], 3 ['id' => 2, 'location' => '台東区', 'name' => '今戸神社'], 4 ['id' => 3, 'location' => '台東区', 'name' => '東京国立博物館'], 5 ['id' => 4, 'location' => '墨田区', 'name' => '江戸東京博物館'], 6 ['id' => 5, 'location' => '墨田区', 'name' => '東京スカイツリー'], 7 ['id' => 6, 'location' => '千代田区', 'name' => '東京駅'], 8 ['id' => 7, 'location' => '千代田区', 'name' => '皇居'], 9 ['id' => 8, 'location' => '中央区', 'name' => '歌舞伎座'], 10]; 11 12$tmp = ''; 13foreach ( $variable as $value ){ 14 if ( $value['location'] !== $tmp ) { 15 $tmp = $value['location']; 16 echo '<h2>'.$tmp.'</h2>'.PHP_EOL; 17 } 18 echo '<p>'.$value['name'].'</p>'.PHP_EOL; 19}

投稿2019/08/05 14:31

kei344

総合スコア69458

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

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

退会済みユーザー

退会済みユーザー

2019/08/06 03:34

ご回答ありがとうございます。 とてもシンプルにコードを書けるのだと勉強になりました。 今回はlocationの順序が決まっている(区ごとで固まっている)のでkei344様の回答を参考にさせていただきます。 ありがとうございました。
guest

0

やはり一度扱いやすいように変換してから処理するとよいです

PHP

1 $variable = [ 2 ['id' => 1, 'location' => '台東区', 'name' => '浅草寺'], 3 ['id' => 2, 'location' => '台東区', 'name' => '今戸神社'], 4 ['id' => 3, 'location' => '台東区', 'name' => '東京国立博物館'], 5 ['id' => 4, 'location' => '墨田区', 'name' => '江戸東京博物館'], 6 ['id' => 5, 'location' => '墨田区', 'name' => '東京スカイツリー'], 7 ['id' => 6, 'location' => '千代田区', 'name' => '東京駅'], 8 ['id' => 7, 'location' => '千代田区', 'name' => '皇居'], 9 ['id' => 8, 'location' => '中央区', 'name' => '歌舞伎座'], 10]; 11 12$temp=[]; 13array_walk($variable,function($x) use(&$temp){ 14 $y=array_search($x["location"],array_map(function($x){return $x["location"];},$temp)); 15 if($y===false){ 16 $temp[]=["location"=>$x["location"],"names"=>[$x["id"]=>$x["name"]]]; 17 }else{ 18 $temp[$y]["names"][$x["id"]]=$x["name"]; 19 } 20}); 21 22print_r($temp); //確認用 23 24foreach($temp as $val){ 25 print "<h2>{$val["location"]}</h2>\n"; 26 foreach($val["names"] as $name){ 27 print "<p>{$name}</p>\n"; 28 } 29}

投稿2019/08/06 01:04

yambejp

総合スコア115012

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

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

退会済みユーザー

退会済みユーザー

2019/08/06 03:24

ご回答ありがとうございます。 array_walkやarray_searchなど見慣れない関数があって勉強不足だと痛感しました。 ご教示いただいたコードを参考に勉強させていただきます。 ありがとうございました。
guest

0

kei344さんので十分だと思いますが、
もしデータの集計からやってみたいなら…

php

1$variable = [ 2 ['id' => 1, 'location' => '台東区', 'name' => '浅草寺'], 3 ['id' => 2, 'location' => '台東区', 'name' => '今戸神社'], 4 ['id' => 3, 'location' => '台東区', 'name' => '東京国立博物館'], 5 ['id' => 4, 'location' => '墨田区', 'name' => '江戸東京博物館'], 6 ['id' => 5, 'location' => '墨田区', 'name' => '東京スカイツリー'], 7 ['id' => 6, 'location' => '千代田区', 'name' => '東京駅'], 8 ['id' => 7, 'location' => '千代田区', 'name' => '皇居'], 9 ['id' => 8, 'location' => '中央区', 'name' => '歌舞伎座'], 10]; 11 12$locs = []; 13$rslt = []; 14foreach ($variable as $value){ 15 if (!in_array($value['location'], $locs)) { 16 $locs[] = $value['location']; 17 $rslt[] = ['location'=>$value['location'], 'names'=>[]]; 18 } 19 $n = array_search($value['location'], $locs); 20 $rslt[$n]['names'][] = $value['name']; 21} 22//var_dump($rslt); 23 24foreach ($rslt as $data) { 25 echo '<h2>' . $data['location'] . '</h2>'; 26 foreach ($data['names'] as $nam) { 27 echo '<p>' . $nam . '</p>'; 28 } 29}

location を連想配列のキーにすれば少し簡単になりますが、
個人的なシュミでこのようにしています。

投稿2019/08/05 23:29

takasima20

総合スコア7460

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

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

退会済みユーザー

退会済みユーザー

2019/08/06 03:33

ご回答ありがとうございます。 コードを拝見して連想配列の意味をきちんと理解していなかったなと思いとても参考になりました。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問