herhangi bir giriş değerleri bir dizi birini sürekli atamak kullanarak php

4 Cevap

Ben A ve B olarak adlandırılan Örnekteki uğruna iki giriş alanları

Ne istediğimi, nasılsa bir karma veya bu girdilerin toplam türetmek, ve sürekli bana sonuçların bir dizi birini verecek olan bir php fonksiyonu olduğunu geçmek, ancak etmektir.

İşte bence ne should gibi görünüyorsun

pseudo code

$a = $_POST[a];
$b = $_POST[b];

$pre = "$a$b";
// Put both inputs together as a single string

$hash = mashup($pre);
// Do something that creates a "hash" of the inputs given.

$output = magicfunction($hash);
// Takes the "hash" and uses some magic method to match it to a particular output

Şimdi ne olursa olsun girişler koymak ne, çıkış biri 20 şeyler söylüyorlar. Kullanıcı farklı bir şey girerse, söndürmek farklı olacaktır, ancak giriş aynı şeyi, eğer sürekli aynı şeyi dönecektir. Çıkışına bir giriş aynı bilgi, ancak aynı giriş aynı çıkış neden olur, böylece bir katı olması gerekmektedir çıkışına ne alır yöntemi için olası.

Im hakkında konuşurken ne bir örnek (ama ne yapmaya çalışıyor im), adınızı girin ve zam yıldız isim, ya da rock yıldızı adı, ya da her neyse gibi, bazı yenilik adını veren bu siteleri. Eğer aynı adı girerseniz onun sadece rastgele değil, aynı sonucu almak, ancak farklı isimler aynı zamanda bu sonuç verebilir.

4 Cevap

Ne gerek PHP md5() işlevi gibi bir şey gibi geliyor. Bu herhangi bir uzunlukta bir dize girişi dayalı benzersiz bir 32 karakter karma dize oluşturur.

Farklı girişleri aynı karma vermek Çarpışmalar çok nadirdir, ama çok giriş değişen varsa olabilir. Eğer collisons sayısını artırmak istiyorsanız sadece () örneğin için substr kullanabilirsiniz sadece karma-dize ilk 3 karakter alır.

Ben kolay yolu daha sonra bir dizide baktım olabilir 0-19 aralığında, bir değer söylemek dize çözmek olduğunu düşünüyorum. Bir şekilde bu yapılabilir, $pre döngü ve bunun üzerine ASCII değerleri ve daha sonra sonunda "mod 20" yapmak eklemeye devam. Aşağıya bakın.

function hashup($str,$totalSetSize = 20)
{
    $sum = 0;
    for ($i = 0; $i = strlen($str); $i++)
    {
        $sum += ord($str[$i]);
    }
    return ($sum % $totalSetSize);
}

hashup () sadece bir dizide aramak hangi magicfunction, aralık 0-19 bir değer dönecekti.

function magicfunction($idx)
{
    return $ROCK_STAR_NAMES[$idx];
}

Gerçekte magicfunction gerekmez rağmen, ben sadece örnek ile tutarlı tutmak için buraya koydum.

Yukarıdaki karma nesil ile, isimleri 'a' ve 'b' size ROCK_STAR_NAME sonraki adını verecekti. Eğer bu sırayla olmak istemiyorsanız, size $pre=md5("$a$b") yapmak ve sonra hashsup onu geçmek gerekir.

(Tek bir karma aksine) Öncelikle, birden fazla girişler tek bir karma istediğinizden emin misiniz?

Ne olursa olsun, önemsiz bir 'karma' oluşturmak için array_count_values (dizeleri ve ints üzerinde çalışır) gibi bir şey kullanın ve sonra her karma için çıkışını seçmek için aralıkları bir dizi kullanabilirsiniz. Örneğin:

$charHash = array_count_values(str_split($_POST['a'].$_POST['b']));

Bu, (daha fazla bilgi olmadan söylemek zor) ulaşmak için çalışıyoruz ne için çok basit olabilir, ama makul bir yaklaşım gibi görünüyor.

Bağımlılık Enjeksiyon ve yukarıda aip.cd.aish karma yöntemini kullanmak Revize kodu:

class Mapper
{
    protected $map = array();

    // Having to pass the map on instantiation allows us to
    // reuse the Mapper class for any map you want.
    public function __construct(array $map)
    {
        $this->map = $map;
    }

    // ** EDIT ** replaced my original hash method 
    // with the one from aip.cd.aish - so kudos to him.
    public function hash($str)
    {
        $sum = 0;
        for ($i = 0; $i = strlen($str); $i++) {
            $sum += ord($str[$i]);
        }
        return $sum;
    }

    public function mapInput($input)
    {   
        $output = $input;
        $items  = count($this->map);
        if($items > 0) {
            $hash   = $this->hash($input);
            $key    = $hash % $items;
            $output = $this->map[$key];
         }
         return $output;
    }        
}

// create new Mapper and pass the map to it.    
$mapper = new Mapper(array('cheese', 'onions', 'pepper', 'garlic', 
                           'tomatoe','sausage', 'ham', 'squid', 
                           'eggs', 'beef'));

echo $mapper->mapInput('Patrick');