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
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")));
Farklı iki dal arasında tamamlar...
Uyarı: aynı bağımlı derlemenin farklı ...
Neden Python karşılaştırma dizeleri ku...
Nasıl bir nokta bir doğru üzerinde iki...
Orada değilse kullanma arasında anlaml...