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

  • ETrade Supply

    ETrade Suppl

    23 Temmuz 2011
  • Joshua Kywn

    Joshua Kywn

    17 Mayıs 2010
  • undrmyumbrellaa

    undrmyumbrel

    25 Temmuz 2012