SORU
19 EYLÜL 2011, PAZARTESİ


Farklı olduğunu ilk karakteri iki dizeleri arasında

Eşit uzunlukta iki dizeleri göz önüne alındığında, ilk farklı karakter mahsup için zarif bir yolu var mı?

Bariz çözüm olabilir:

for ($offset = 0; $offset < $length;   $offset) {
    if ($str1[$offset] !== $str2[$offset]) {
        return $offset;
    }
}

Ama bu çok doğru, böyle basit bir görev için görünmüyor.

CEVAP
19 EYLÜL 2011, PAZARTESİ


bitwise XOR (^) güzel bir özellik bunu başarmak için kullanabilirsiniz: iki dize birlikte xor temel olarak, aynı karakterler boş bayt ("\0") olacak. Eğer iki dize biz xor, biz sadece ilk boş olmayan bayt strspn kullanarak konumunu bulmak için:

$position = strspn($string1 ^ $string2, "\0");

İşte bu kadar. Hadi bir örnek bak:

$string1 = 'foobarbaz';
$string2 = 'foobarbiz';
$pos = strspn($string1 ^ $string2, "\0");

printf(
    'First difference at position %d: "%s" vs "%s"',
    $pos, $string1[$pos], $string2[$pos]
);

Bunun çıktısı:

7 numara ilk başta fark: "" vs "ben"

Bu şekilde olması gerek.çoksadece C fonksiyonlarını kullanarak, ve dize bellek sadece tek bir kopyasını gerektirir beri etkili.

Edit: Aynı Doğrultuda: Boş Bir Çözüm

function getCharacterOffsetOfDifference($str1, $str2, $encoding = 'UTF-8') {
    return mb_strlen(
        mb_strcut(
            $str1,
            0, strspn($str1 ^ $str2, "\0"),
            $encoding
        ),
        $encoding
    );
}

İlk bayt düzeyinde fark yukarıdaki yöntem ve uzaklık karakter seviyesi eşleştirilir kullanarak bulundu. Bu temelde substr mb_strcut işlevi kullanarak, ama belge karakter sınırları onurlandıran yapılır.

var_dump(getCharacterOffsetOfDifference('foo', 'foa')); // 2
var_dump(getCharacterOffsetOfDifference('©oo', 'foa')); // 0
var_dump(getCharacterOffsetOfDifference('f©o', 'fªa')); // 1

İlk çözüm olarak şık değil, ama yine de oyunu bir (ve eğer kullanıyorsanız varsayılan biraz daha basit kodlama):

return mb_strlen(mb_strcut($str1, 0, strspn($str1 ^ $str2, "\0")));

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • bobono1baby

    bobono1baby

    14 AĞUSTOS 2011
  • InfoPuppet

    InfoPuppet

    15 Kasım 2011
  • spectragirlz16's channel

    spectragirlz

    22 Ocak 2012