Blog Kategorileri

Son Eklenen Konular

Yazı içerisindeki kelime veya harf sayma
Resim

Metin içerisindeki bir kelimenin kaç tane olduğunu bulmanın birden çok yöntemi var. PHP' nin bu konuda kendi içerisinde yerleşik bir metoduda bulunmakta

php

substr_count($haystack, $needle)

substr_count metotdu iki parametre almaktadır bunun haricindede 2 tanede opsiyonel parametresi ile toplamda 4 parametre alır.

php.net http://tr2.php.net/manual/en/function.substr-count.php  adresinden daha detaylı bakabilirsiniz.

1. parametre içerisinde arama yapmak istediğiniz karakter grubunu alır

2. parametre saymak istediğiniz karakter katarını alır.

Örnek

php

<?php
echo  substr_count($bununicinde, $bundankactanevar);
?>

php.net sitesinde aranılacak kelimenin küçük harf duyarlı olduğunu belirtiyor, bize daha farklı büyük küçük harfe duyarsız olup kelime arasında dahi olanları saydırmaya çalışırsak kendimize özel bir metod yazabiliriz.

Senaryomuz şu şekilde olsun : Bize farklı bir kaynaktan sadece başlık ve açıklama şeklinde bir veri geliyor ve biz bu kaynağın hangi kategoriye gitmesi gerekiyorsa, bunu php nin kendine bırakmak istiyoruz

bu sitedeki kategorilerden örnek vereyim 1224-> mobil, 7525-> oyun, 8326 -> web  şeklinde kategorilerimizin olduğunu farzederek şu şekilde bir dizi değişken oluşturalım .

php

$kategoriler = array(
			1224 => array(
                     "catid" => 1224,
                     "name" => "Mobil",
                     "tags" => "iphone,mobil,nokia,android,BlackBerry,telefon,GALAXY S,AKILLI TELEFON,batarya,tablet,iPad",
                  ),
            7525 => array(
                     "catid" => 7525,
                     "name" => "Oyun",
                     "tags" => "oyun,game,konsol,PlayStation,Playstore,Oyunsever,Xbox",
                  ),
            8326 => array(
                     "catid" => 8326,
                     "name" => "Web",
                     "tags" => "google,yahoo,twitter,facebook,Instagram,web,gmail,mail,webmail,outlok,hotmail",
                  ),
		);

Yukardaki kodumuzda

$kategoriler isimli dizi değişkenimizin ilk değerinine baktığımızda 1224 kategori id ve tags değerlerine baktığımızda metin içerisindeki aramasını istediğimiz kelimelerimiz bulunuyor ve diğer değerlerde aynı şekilde. Burdaki amacımız anahtar kelimeleri metin içerisinde aratıp toplamlarını alıp hangisinden çok ise geriye onun catid değerini döndererek hangi kategoriye gitmesini sağlayacak karırı verdirmek.

 

Metod yazıyoruz


php

kategoriBelirle($text,$kategoriler){//$kategoriler yukardaki değişkenimiz
            if(empty($text)){return 6521;} //6521 sonuc olmadığında bize döndereceği alternatif kategori id miz
            
            //arama yapmak istediğimiz $text karakter grubunu boşluklarından ayırarak alternatif bir yol uygulamış oluyorum, harf sayısına görede yapılabilinir fakat yorucu olucağını düşünüyorum 
            $countKelime = count(explode(" ", $text));
            
            //hangi kelimeden kaçtane bulduğunu depolayacağımız değişken
            $toplamlar = array();

            //ilk olaark $kategoriler dizimizi dönderelim
            foreach ($kategoriler as $key => $value) {
               
               //döngüden gelen kategorinin tags değerini döndermek için virgüllerinden ayırarak dizi değişken haline dönüştürüyorum
               $search = explode(',', $value['tags']);   

               foreach ($search as $tag) {
                   
                   $x = 0; //kalime sayacımız 
                   $start = 0; //stripos metodu için $text değişkeninde aramaya başlayacağı karakter sayısı

                   for ($i=0; $i < $countKelime; $i++) {
                      if(($strt = stripos($text, $tag, $start)) !== false){//stripos büyük küçük kelime ayrımı olmadan arama yapar
                          $x++;
                      }else{
                         break;//hiç bulamadıysa döngüye devam etmesine gerek yok döngüyü durduruyorum
                      }
                      $start = ($strt + 1);//misal $text değişkeninde 5. karakterte bulduysa aynısını tekrar bulmaması için değeri 1 artırarak onu atlamasını sağlıyorum
                   }
                   
                   if($x > 0){
                      //$toplamlar[1224]['iphone'] = 8; şeklinde alt tarafta depolama yapıyorum
                      $toplamlar[$key][$tag] = $x; //hangi anahtar kelimenin kaçtane olduğunu depoluyoruz
                   }
               }
            
            }

            //ve son olaylarımız toplamlar dizimizdeki kategori index lerinin değerlerini toplatıp en büyük değere sahip olanı $cat değişkenine atayıp return etmek
            if(count($toplamlar) > 0){//kelime bulup bulmaması
                $cat = 6521; //varsayılan kategorimiz
                $top = 0;

                foreach ($toplamlar as $key => $value) {

                    if($a = array_sum($value) > $top){//array_sum dizi değişkenin elemanlarının toplamını dönderir

                        $cat = $key; //varsayılan kategorimiz değişti
                        
                        //$top = $a; //örn $key eşitse 1224 $key için toplam kaçtane anahtar kelime var 
                        //$anahtarlar = implode(', ', array_keys($value)); //belki anahtar kelimeleri sonradan almak isteyebilirsiniz.

                    }
                } 
                
            }else{
                $cat = 6521;
            }
            
            
            return $cat;
        }

metodumuz açıklama metinleri nedeni ile baya bir büyük göründü.

"//ve son olaylarımız " diye bahsettiğim kısımda döngü değil array sıralama metodları ilede yapabilirdim fakat daha sonrasında bulunan anahtar kelimeler ve toplamlarınada ulaşmak istenebilir düşüncesi ile esnek tutmaya çalıştım.

 

Yazdığım metod içerisinde geçen metodlar


stripos : bu metod strpos olarak biliyor olabilirsiniz yalnız strpos büyük küçük harfe duyarlıdır stripos ise duyarsızdır bkz. http://tr2.php.net/manual/en/function.stripos.php

array_sum : dizi değişkeninde değerlerin toplamını verir. bkz. http://tr2.php.net/manual/en/function.array-sum.php

comments powered by Disqus