2009-07-26 14 views
7

私は一連のファイルを検出する方法を見つけようとしています。例えば:ファイル名の一般的な文字列のグループを検出する方法

、指定したディレクトリ以下のファイルがある場合:

  • Birthday001.jpg
  • Birthday002.jpg
  • Birthday003.jpg
  • Picknic1.jpg
  • Picknic2.jpg
  • Afternoon.jpg。私は何か
  • Picknic(2枚)誕生日(3枚)
    • のような午後(1画)
    に凝縮にリストを取得したいと思い

グループの検出方法は?

+0

唯一のアルゴリズムが本質的には無理な力でなければ、これは大きな疑問だと思います。 –

答えて

6

これを解決できる方法の1つは、ブルートフォース方式よりも効率的です。

  • 荷重剥離名前と名前に等しい値が、桁キー等しいと連想配列(preg_replace('/\d//g', $key))にすべての名前。

あなたは今のカウントである第一の配列と値からの値ですキーで別の連想配列を作る$arr1 = [Birthday001 => Birthday, Birthday002 => Birthday ...]

  • のようなものを持っています。すでにキーを見たときにカウントを増やしてください。
  • 最後に、あなたが望むように、名前と数を含む2番目の配列になります。 $arr2 = [Birthday => 2, ...]
+1

これは、一度数字が取り除かれると、すべての意味的トークンが等しいと仮定すると機能します。これは「My Birthday001.jpg」や「MyBirthday002.jpg」のような項目には当てはまらないが、良い出発点だ。 – Kitson

+0

私は絶対に同意します。しかし、質問はそのように提起されたのではなく、私の誕生日を含めてそれを編集してBirthday001とグループ化する人は誰でも、Birthday002は質問をかなり変えました。営業担当者は実際にそれを2つの異なるグループに分類したいかもしれません。 –

+0

はい、これは私が探しているものです。私の主な関心事は接頭辞の文字列と一致していたこれは素晴らしい出発点です。ありがとうございました。 – Ambirex

2

のようなものだけでキーの正規表現によって変更されたヒストグラムの構築:この配列を開発する「私」である、非常に重要になります(「私」のような単語の配列を生成する

<?php 

# input 
$filenames = array("Birthday001.jpg", "Birthday002.jpg", "Birthday003.jpg", "Picknic1.jpg", "Picknic2.jpg", "Afternoon.jpg"); 

# create histogram 
$histogram = array(); 
foreach ($filenames as $filename) { 
    $name = preg_replace('/\d+\.[^.]*$/', '', $filename); 
    if (isset($histogram[$name])) { 
     $histogram[$name]++; 
    } else { 
     $histogram[$name] = 1; 
    } 
} 

# output 
foreach ($histogram as $name => $count) { 
    if ($count == 1) { 
     echo "$name ($count picture)\n"; 
    } else { 
     echo "$name ($count pictures)\n"; 
    } 
} 

?> 
+0

これは、コードを除いて私のバージョンとほとんど同じです。 –

0

をあなたの例では唯一のものです)、すべてのファイル名のうちこれらを取り除きます。すべての数字と句読点を除外してください。また、この時点では拡張機能は長くなくなっています。これが完了したら、すべてのユニークな結果を配列に入れます。これを、かなり信頼性の高いキーワードのソースとして使用して、他の処理が捕まえなかった妨害要因を検索することができます。

+0

注:この回答は、その後ロールバックされた質問の改訂版に基づいています。このバージョンには、「Birthday.jpg」という名前のファイルが含まれていましたが、他の「Birthday」ファイルとグループ化されていました。 –

関連する問題