dポイントプレゼントキャンペーン実施中!

PHPで複数配列で重複する文字列が含まれている場合の処理の仕方について

$a[0] = "あああいいいうううかかかききき";
$a[1] = "あああいいいうううかかかくくく";
$a[2] = "あああいいいうううかかかけけけ";
$a[3] = "あああいいいうううきききききき";

上記のような配列があったとします(配列の要素数については可変です)

上記配列の中で共通する文字列を削除し(文字列の先頭のほうを削除)
$a[0] = "かかかききき";
$a[1] = "かかかくくく";
$a[2] = "かかかけけけ";
$a[3] = "きききききき";

のようにしたいのですが処理方法が思い浮かびません。

文字列を分解して比較する処理まではできるのですが、要素数が3つになったり7つになったりした場合の方法が思い浮かびません。
どなたか 分かる方よろしくお願いします。

A 回答 (2件)

こんな感じでいかがでしょう。



--
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 );
}
    • good
    • 0
この回答へのお礼

素早い回答ありがとうございます。
希望通りにできました!

ありがとうございました。

お礼日時:2012/01/05 13:11

こんな感じで



<?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の要素を削除すれば、命題の結果になります。

※もちろんもっと簡単なロジックもあるとは思います。
    • good
    • 0
この回答へのお礼

すばやい回答ありがとうございます。
早速試してみたところ、中途半端な文字列になってしまいました。
重複している文字を抜き取るような感じでしょうか。
私が欲しかったのは文字列の先頭のほうを削除する方法です。
(上手く説明できてなくてすみません)

よって ky072さんの方法を使わせて頂くことにします。
ありがとうございましました。

お礼日時:2012/01/05 13:08

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!