Regex kullanıp telefon numarasına göre elde ettiğin dosya isimlerini döngü içinde kontrol edebilirsin.
Burada tek bir klasör içindekileri arar.
private function scanDir($targetDir, $needle){
if (File::exists($targetDir)){
$files = array_diff(scandir($targetDir), array('.', '..'));
foreach($files as $file) {
preg_match("/([0-9]+)-([0-9]+)(.*)\.wav/", $file, $matches);
if ($matches && $matches[1] == $needle && File::exists($file)) {
return $file;
}
}
}
return null;
}
Tarihlere vs bölüp iç içe klasörler şeklinde dosyaları tutuyorsan bu durumda recursive olarak tüm dosyaları ele almamız gerekiyor. Bunun için de PHP bize RecursiveDirectoryIterator sınıfı sağlamış. Böylece alt klasördeki dosyaları da ele alabiliriz.
private function scanDir($target, $needle){
if (File::exists($target)){
$it = new RecursiveDirectoryIterator($target, RecursiveDirectoryIterator::SKIP_DOTS);
$files = new RecursiveIteratorIterator($it, RecursiveIteratorIterator::CHILD_FIRST);
foreach($files as $file) {
preg_match("/([0-9]+)-([0-9]+)(.*)\.wav/", $file, $matches);
if ($matches && $matches[1] == $needle && File::exists($file)) {
return $file;
}
}
}
return null;
}
Yukarıda return $file;
dediğim bölümlerde bulduğu ilk sonucu döner. Eğer birden fazla sonuç döndürmek istiyorsan bu durumda foreach bölümünde elde ettiğim tüm match'leri ayrı bir dizide toplayıp en sonunda onu dönmen gerekiyor.
$numberMatches = [];
foreach($files as $file) {
preg_match("/([0-9]+)-([0-9]+)(.*)\.wav/", $file, $matches);
if ($matches && $matches[1] == $needle && File::exists($file)) {
$numberMatches[] = $file;
}
}
if (count($numberMatches)) {
return $numberMatches;
}
Bunlar örnek kodlar, bir helper classının içinde ihtiyacına göre kurgulayıp sonra controller'dan çağırabilirsin. Eğer on binlerce veya daha fazla dosya varsa her biri regexten geçeceği için performans konusunda sorun yaşaman olası. Bu yüzden dosyaların isimlerini veritbanında tutup arama vs yaptırman daha hızlı ve kolay olur.
Dosyların kontrolü sistemdeyse, silinen eklenen kayıtlar vs en azından senin elinden geçiyorsa ve MySQL gibi veritabanlarını kullanmak istemiyorsan dosya tabanlı SQLite gibi basit çözümleri de düşünebilirsin. Çünkü sistem yük altındaysa sürekli dosyaları tarayıp regexten geçirmek iyi bir fikir olmayabilir.
Kolay gelsin.