PHPで複数配列で重複する文字列が含まれている場合の処理の仕方について
$a[0] = "あああいいいうううかかかききき";
$a[1] = "あああいいいうううかかかくくく";
$a[2] = "あああいいいうううかかかけけけ";
$a[3] = "あああいいいうううきききききき";
上記のような配列があったとします(配列の要素数については可変です)
上記配列の中で共通する文字列を削除し(文字列の先頭のほうを削除)
$a[0] = "かかかききき";
$a[1] = "かかかくくく";
$a[2] = "かかかけけけ";
$a[3] = "きききききき";
のようにしたいのですが処理方法が思い浮かびません。
文字列を分解して比較する処理まではできるのですが、要素数が3つになったり7つになったりした場合の方法が思い浮かびません。
どなたか 分かる方よろしくお願いします。
No.1ベストアンサー
- 回答日時:
こんな感じでいかがでしょう。
--
mb_internal_encoding( 'UTF-8' );
$offset = 0;
for( $i = mb_strlen( $a[0] ); 0 < $i; $i-- ){
$prefix = mb_substr( $a[0], 0, $i );
$match = true;
foreach( $a as $str ){
if( mb_strpos( $str, $prefix ) !== 0 ){
$match = false;
break;
}
}
if( $match ){ $offset = $i; break; }
}
foreach( $a as &$str ){
$str = mb_substr( $str, $offset );
}
No.2
- 回答日時:
こんな感じで
<?PHP
$a[0] = "あああいいいうううかかかききき";
$a[1] = "あああいいいうううかかかくくく";
$a[2] = "あああいいいうううかかかけけけ";
$a[3] = "あああいいいうううきききききき";
$b=array();
for($j=0;$j<count($a);$j++){
$c=array();
if($j==0) $temp=&$b; else $temp=&$c;
for($i=0;$i< mb_strlen($a[$j]);$i++){
$str=mb_substr($a[$j],$i,1);
if(array_search($str,$temp)===false) $temp[]=$str;
}
if($j>0) $b=array_diff($b,array_diff($b,$c));
unset($c);
}
for($i=0;$i<count($a);$i++){
$a[$i]=str_replace($b,"",$a[$i]);
}
print_r($a);
?>
ロジック:
$a[0]の要素を$bにとっておき、$a[1]以降の要素を$cにとります。
$bと$cをくらべて、$bにしかない要素を$bから削除すると、
$aを一回りすれば$bには、全ての$aに共通する要素だけ残ります。
そこで、$aから$bの要素を削除すれば、命題の結果になります。
※もちろんもっと簡単なロジックもあるとは思います。
すばやい回答ありがとうございます。
早速試してみたところ、中途半端な文字列になってしまいました。
重複している文字を抜き取るような感じでしょうか。
私が欲しかったのは文字列の先頭のほうを削除する方法です。
(上手く説明できてなくてすみません)
よって ky072さんの方法を使わせて頂くことにします。
ありがとうございましました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・人生のプチ美学を教えてください!!
- ・10秒目をつむったら…
- ・あなたの習慣について教えてください!!
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・【大喜利】【投稿~9/18】 おとぎ話『桃太郎』の知られざるエピソード
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
配列操作
-
漢字のソートについて
-
配列をmb_ereg_replaceで一気に...
-
$_SESSIONに二次元配列を使える...
-
String だと「 ByRef引数の型が...
-
foreachのなかで次のキーを参照...
-
URLのサブドメインとドメイン部...
-
PHPのループ数限界値について
-
配列一致(要素順番は違うが内容...
-
◆配列内の値削除
-
PHPのusort関数について
-
行列
-
配列の順番により別の配列を並...
-
マッチング処理(1:N)
-
別ファイルの構造体の値を読み...
-
プルダウンメニューにDBの内容...
-
どちらが速いのか?mysql_num_rows
-
MYSQLとPHPによって取得する多...
-
新大阪・梅田周辺でチェックア...
-
C言語の配列をPush(追加)する...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
配列をループでたくさん宣言し...
-
$_SESSIONに二次元配列を使える...
-
String だと「 ByRef引数の型が...
-
foreachのなかで次のキーを参照...
-
file_existsでファイル名の部分...
-
PHPのカッコ[ ]の使い方について
-
postgresql関数をつかったレコ...
-
multiple属性のPOSTを配列で受...
-
PHPとMySQLの高速化
-
Smartyのテンプレートからjavas...
-
漢字のソートについて
-
配列一致(要素順番は違うが内容...
-
PHPで配列をPOSTデータで送った...
-
PHP 配列の添字に変数は使えない?
-
ネストが深い時のforeachはどう...
-
PHP 多次元配列変数のデータ受...
-
テキストの処理について
-
smartyで配列の中の同数値の数...
-
レンタルサーバでMYSQLに...
-
配列を回すとき、最後の要素だ...
おすすめ情報