xcorp Mesaj tarihi: Mart 11, 2018 Paylaş Mesaj tarihi: Mart 11, 2018 öncelikle selamlar, yapmaya çalıştığım girilen kelimelerin bütün varyasyonlarını db de aratmak. örneğin "1 2 3" girildiğinde; "1 2 3", "1 2" , "1 3", "2 3" , "1", "2" , "3" hepsini aratmak istiyorum. internetten bulduklarımla bir şeyler yaptım ama emin olamadım, bu sefer de acaba sql açığı olur mu diye korktum. girilen kelime kombinasyonlarını bulmak için; $keywords = ['baba', 'beni', 'okula', 'gonder' , '']; $GLOBALS['a'] = []; function combine($word, $arr){ if ($word !== "" && count($arr) === 0){ return; } if($word !== ""){ array_push($GLOBALS['a'] , $word); } if(count($arr) > 0){ $n_word = $arr[0]; array_shift($arr); if($word !== "" && $n_word !== ""){$n_word = " " . $n_word;} combine($word.$n_word, $arr ); combine($word, $arr); } } combine("", $keywords); dd(array_unique($GLOBALS['a'])); local veri beceremeyince global denedim. ama birden fazla aynı sonucu verdi. array_unique() ile istenilen sonuca ulaştım ama içim rahat etmedi. db deki tabloları birleştirip hepsinde aratmaya çalışıyorum. alttaki kod çalışıyor ama doğru mudur emin olamadım. IlluminateDatabaseQueryBuilder::macro('searchValues', function ($columnName, $keys) { $que; foreach($keys as $index=>$key){ if($index == 0) { $que = $this->where($columnName, 'LIKE', '%'.$key.'%'); }else { $que = $que->orWhere($columnName, 'LIKE', '%'.$key.'%'); } } return $que; }); bir de union yaptığım tablolardan birinden isim birinden title çekiyorum. kullanım yanlıs mı ona emin olamadım. hep aynı sütundan veri çekilen örnekleri bulabildim. $result_p = post::select("id","title", DB::raw("NULL as name"),"picture","slug" ,DB::raw("'post' as source"))->searchValues('title' , $generated); $result_t = tag::select("id",DB::raw("NULL as title"), "name",DB::raw("NULL as picture"),"slug",DB::raw("'tag' as source"))->searchValues('name' , $generated); $result = $result_p->union($result_t)->get(); bu da iyi güzel hoş da zurnanın zırt dediği yer şu ki en üstteki kodun çıktısı: 0 => "baba" 1 => "baba beni" 2 => "baba beni okula" 3 => "baba beni okula gonder" 6 => "baba beni gonder" 9 => "baba okula" 10 => "baba okula gonder" 13 => "baba gonder" 15 => "beni" 16 => "beni okula" 17 => "beni okula gonder" 20 => "beni gonder" 22 => "okula" 23 => "okula gonder" 25 => "gonder" şeklinde oldugundan aranılan kelimelere ait tam bir veri varsa 0, 1 ve 2 den sonra geliyor. combine fonksiyonunun en cok kelime içeren veriyi 0 a, sonrasında da sırasıyla azala azala eklemesini isterdim aranacak verileri. asıl sormak istediğim yer de tam burası. var mıdır yardımcı olacak birileri ): Link to comment Sosyal ağlarda paylaş Daha fazla paylaşım seçeneği…
Lancelion Mesaj tarihi: Mart 11, 2018 Paylaş Mesaj tarihi: Mart 11, 2018 sort by levensthein distance ? overkill olabilir biraz =p https://stackoverflow.com/questions/7217746/how-to-sort-an-array-by-similarity-in-relation-to-an-inputted-word Link to comment Sosyal ağlarda paylaş Daha fazla paylaşım seçeneği…
xcorp Mesaj tarihi: Mart 11, 2018 Konuyu açan Paylaş Mesaj tarihi: Mart 11, 2018 cok teşekkür ederim. levenshteini bu amaçla nasıl kullanacagımı çözemedim. sanırım usortla tekrar dizicem. php cahili oldugumdan usortu kesfetmeme vesile oldu hiç yoktan :D Link to comment Sosyal ağlarda paylaş Daha fazla paylaşım seçeneği…
Lancelion Mesaj tarihi: Mart 11, 2018 Paylaş Mesaj tarihi: Mart 11, 2018 ilk verdigin string'e 'benzemeye' gore sort etmek icin kullanabilirsin ama zaten php'de similar sort gibi bir sey varmis. Link to comment Sosyal ağlarda paylaş Daha fazla paylaşım seçeneği…
Öne çıkan mesajlar