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

  • newreleaseblitz

    newreleasebl

    13 Ocak 2010
  • SuicideSheeep

    SuicideSheee

    8 Ocak 2012
  • Videojug

    Videojug

    25 EKİM 2006