Ben bir veritabanından öğelerin kombinasyonlarını oluşturmak için bir algoritma yazıyorum. Bu eşsiz permütasyon (yani 145, 156 == 156, 145) olması gerekir. Ben çalıştırıyorum sorun i 145, 156 ve 156, 145 ile sona kalmamak önceki kombinasyonları takip için nasıl.
I kontrol böylece Şu anda ben (id her zaman en yüksek olmak yüzden sıralanır) ... id1_id2 endeksi ile bir dizi ekleyerek ve bir combo oluşturulur, 1'e eşit değerini ayarlama ediyorsam $ tarak [$ index] var ya da yok. O yoksa, oluşturun. Bu kombinasyonlar oluşturulur sonra (orada HER permutation ayıklamak için başka kriterler vardır, ama onlar alakasız), onlar MySQL bir tablo muhafaza edilmektedir.
Ben çalıştırıyorum sorun test öğeleri ile ben kombinasyon sayısı MASİF ve $ kombinasyonları dizi olarak (yaklaşık 85) Ben bellek tükeniyor olmadan fazla 3 ürün (id1_id2_id3) ile kombinasyonları oluşturmak olamaz kullanıyor olmam i PHP bellekte ayrılan am 64M daha alır.
I a) önceki tarak takip veya b) $ tarak dizi rotayı atlama ve sadece MySQL ve MySQL yinelenen kontrolünü ele izin benzersiz bir satır eklemeden yapabilirsiniz bir yolu var mı.
Burada referans için bazı sözde kod:
$items = array(/*85 items*/);
foreach ($items as $item1){
generate(array($item1));
foreach($items as $item2){
generate(array($item1, $item2));
}
}
}
function generate($items_arary){
$temp_array = array();
foreach ($items_array as $item){
$temp_array[] = $item['id'];
}
sort($temp_array);
$index = implode("_", $temp_array);
if (!$combos[$index]){
$combos[$index] = 1;
/* some code to generate query to store to db */
}
}
Sorgu bu gibi bakıyor biter: (veritabanı script başında kesiliyor)
INSERT INTO `combos` (combo_id, more_info) VALUES ('id1_id2', 'Item Name');
Bu soru yazma sürecinde, olası bir çözüm düşündüm: Emin ID3> id2> id1 yapma. Bu $ tarak için ihtiyaç kaldırmak için kalıcı bir çözüm olabilir mi?