• 20-09-2021, 14:42:35
    #1
    Merhaba ben Uğur, bir proje üzerinde çalışıyorum. Projeyi en basit haliyle anlatacağım.

    Bir dizi var. Ve bu dizi hiç veritabanına eklenmediyse hepsini eklenecek. Eğer diziye yeni eleman eklersek bu sefer önceden eklenmiş olanların dışında kalan, farklı elemanları ekleyecek.

    Algoritma çok basit. Koda dökmekte basit ama kod istediğim gibi çalışmıyor. (O zaman koda dökmek zor oluyor olabilir..)

    Farklı elemanı bulan kodu denedim. array_diff fakat farklı elemanı bulmak yerine bana bunu gösteriyor:

    Niye böyle gösteriyor anlamadım. Bana "555" farklıdır demeli ama demiyor.
    Tagler arrayinde fark ettiyseniz boşluklar var. Onları silince de aynı sonucu alıyorum. Yani olay onunla alakalı değil. Hepsi string. Türle'de alakalı değil. $dizi1, $dizi2 yerine $dizi2, $dizi1 de denedim. Yine aynı sonuç.

    Bunun dışında aklıma dizideki aynı olanları tespit edip onları diziden çıkartınca ortada farklı olan kalır diyerek bu kodu yazdım:
    unset($veritabani[array_search($tagsx, $veritabani)]);
    Böyle bir çıktı aldım:

    Yine teoride çalışan şey pratikte çalışmadı. Ne yapsam "555" farklıdır diyip onu yalnız bırakmıyor.

    Bu ihtimallerin dışında MySQL ile konuya müdahale etme fikri geldi. Ama bu durumda veritabanları zorlanır diye endişeleniyorum. 1 kişide pek bir şey olmaz ama 10 bin yada 100 bin kişi işlem yapınca sıkıntı çıkabilir diye düşünüyorum. MySQL'de şunu kurgulamıştım. Bunun için şu konudaki kodlar işe yarayabilirdi. https://www.r10.net/php/2023946-php-ile-mysql-den-cekilen-ayni-icerigi-bir-defa-yazdirma-yardim.html

    Bunu yazarken aynı anda düşünüyorum. Beynim curcuna. 😅 Acaba bunu arraydan çıkartıp 2 değişkeni tek string yani bildiğin cümle yapsam sonra preg_match ile parçalasam mı? Hakikaten kafam karmakarışık. Yardıma ihtiyacım var. Hem kendi arkadaşlarıma yazdım hem de sizinle paylaşıyorum. Teşekkürler.
  • 20-09-2021, 14:54:54
    #2
    Kimlik doğrulama veya yönetimden onay bekliyor.
    Kendimce bir deneme yaptım da, array_diff() fonksiyonu sanırım şöyle işliyor.
    $a = Array(
         "bos",
         "dolu",
         "farkli"
    );
    $b = Array(
         "bos",
         "dolu"
    );
    
    $fark = array_diff($a, $b);
    print_r($fark);
    Bu kodda sorunsuzca çalışıyor. A arrayinin 2 indeksli elemanı olan "farkli" çıktısını alabiliyorum. Ama "farkli" indexini B arrayine aldığımız zaman boş çıktı döndürüyor. Yani array_diff($a, $b), A arrayinde B arrayindekilerden farklı eleman olup olmadığını kontrol ediyor. Bunu sanırım iki kontrol noktası oluşturarak çözebilirsiniz. Yorumları tamamen kendim anladığım kadarıyla yaptım doğruluğundan emin değilim.
  • 20-09-2021, 14:58:50
    #3
    Merhaba,

    Üst yorumdaki üyenin yazdığı gibi array_diff kullanabilirsiniz ya da;
    Explode ile de veritabanına kayıt ettiğiniz kelimeleri ayırın, post'tan gelen kelimeleri foreach ile döndürün foreach içerisinde if & in_array kullanarak çakışan kelime var mı kontrol edin.
    Sitenizde 10-100k kişi aynı anda işlem yapma potansiyeline sahipse zaten özel optimizasyonlu bir sunucuya ihtiyacınız olacak, o nedenle mysql kullanımından kaçınmayın.

    İyi çalışmalar.
  • 20-09-2021, 15:21:22
    #4
     $a = Array(
      "bos",
      "dolu",
      "farkli",
      "r10"
    );
    $b = Array(
      "bos",
      "dolu",
      "ayni",
      "test"
      
    );
    
    $fark = fark_hesapla($a, $b);
    
    print_r($fark);
    
    function fark_hesapla($array1, $array2) {
    
      $farklar = [];
    
      if(count($array1) > count($array2)) {
        $uzun = $array1;
        $kisa = $array2;
      }
      else if (count($array1) < count($array2)) {
        $uzun = $array2;
        $kisa = $array1;
      }
    
      if (isset($uzun)) {
        foreach ($uzun as $eleman) {
          if (!in_array($eleman, $kisa)) {
            $farklar[] = $eleman;
          }
        }
      }
      else {
        foreach ($array1 as $array1e) {
          foreach ($array2 as $array2e) {
            if (!in_array($array1e, $array2)) {
              $farklar[] = $array1e;
            }
            else if (!in_array($array2e, $array1)) {
              $farklar[] = $array2e;
            }
          }
        }
      }
    
      return array_unique($farklar);
    }
    Geceden kalmayım benim de kafam pek yerinde değil ama başardım! Belki daha kısa yolu vardır illa ki, aklıma ilk böyle geldi, denedim çalıştı valla.
  • 20-09-2021, 15:50:53
    #5
    petri adlı üyeden alıntı: mesajı görüntüle
    Kendimce bir deneme yaptım da, array_diff() fonksiyonu sanırım şöyle işliyor.
    $a = Array(
         "bos",
         "dolu",
         "farkli"
    );
    $b = Array(
         "bos",
         "dolu"
    );
    
    $fark = array_diff($a, $b);
    print_r($fark);
    Bu kodda sorunsuzca çalışıyor. A arrayinin 2 indeksli elemanı olan "farkli" çıktısını alabiliyorum. Ama "farkli" indexini B arrayine aldığımız zaman boş çıktı döndürüyor. Yani array_diff($a, $b), A arrayinde B arrayindekilerden farklı eleman olup olmadığını kontrol ediyor. Bunu sanırım iki kontrol noktası oluşturarak çözebilirsiniz. Yorumları tamamen kendim anladığım kadarıyla yaptım doğruluğundan emin değilim.
    Yazıda belirttiğim gibi Diff'i ben de denedim. Ama çalışmamıştı.

    Fakat:
    petri adlı üyeden alıntı: mesajı görüntüle
     $a = Array(
      "bos",
      "dolu",
      "farkli",
      "r10"
    );
    $b = Array(
      "bos",
      "dolu",
      "ayni",
      "test"
      
    );
    
    $fark = fark_hesapla($a, $b);
    
    print_r($fark);
    
    function fark_hesapla($array1, $array2) {
    
      $farklar = [];
    
      if(count($array1) > count($array2)) {
        $uzun = $array1;
        $kisa = $array2;
      }
      else if (count($array1) < count($array2)) {
        $uzun = $array2;
        $kisa = $array1;
      }
    
      if (isset($uzun)) {
        foreach ($uzun as $eleman) {
          if (!in_array($eleman, $kisa)) {
            $farklar[] = $eleman;
          }
        }
      }
      else {
        foreach ($array1 as $array1e) {
          foreach ($array2 as $array2e) {
            if (!in_array($array1e, $array2)) {
              $farklar[] = $array1e;
            }
            else if (!in_array($array2e, $array1)) {
              $farklar[] = $array2e;
            }
          }
        }
      }
    
      return array_unique($farklar);
    }
    Geceden kalmayım benim de kafam pek yerinde değil ama başardım! Belki daha kısa yolu vardır illa ki, aklıma ilk böyle geldi, denedim çalıştı valla.
    Bunda çalıştı. in_array'ı hiç denememiştim. Belki de keramet in_array'daydı.

    Softyr adlı üyeden alıntı: mesajı görüntüle
    Merhaba,

    Üst yorumdaki üyenin yazdığı gibi array_diff kullanabilirsiniz ya da;
    Explode ile de veritabanına kayıt ettiğiniz kelimeleri ayırın, post'tan gelen kelimeleri foreach ile döndürün foreach içerisinde if & in_array kullanarak çakışan kelime var mı kontrol edin.
    Sitenizde 10-100k kişi aynı anda işlem yapma potansiyeline sahipse zaten özel optimizasyonlu bir sunucuya ihtiyacınız olacak, o nedenle mysql kullanımından kaçınmayın.

    İyi çalışmalar.
    Sizin içinde aynı şeyi söyleyeyim. Diff'te çalışmıyor. Yazıyorum ama çalışmıyor. Nasıl çıktı aldığımı yukarıdaki konuda gösterdim. Öte yandan in_array ile çözülüyor. 👌