Tamam, bunun kurşun geçirmez olduğundan emin değilim, ama işe yaradığını düşünüyorum:
echo array_reduce($array, function($reducedValue, $arrayValue) {
if($reducedValue === NULL) return $arrayValue;
for($i = 0; $i < strlen($reducedValue); $i++) {
if(!isset($arrayValue[$i]) || $arrayValue[$i] !== $reducedValue[$i]) {
return substr($reducedValue, 0, $i);
}
}
return $reducedValue;
});
Bu, dizideki ilk değeri referans dizesi olarak alacaktır. Daha sonra, referans dizge üzerinde yineleme yapacak ve her bir karakteri aynı konumdaki ikinci dizenin karakteriyle karşılaştıracaktır. Bir karakter eşleşmezse, referans dizesi karakterin konumuna kısaltılır ve sonraki dizge karşılaştırılır. İşlev o zaman en kısa eşleşen dizeyi döndürecektir.
Performans, verilen dizelere bağlıdır. Referans dizesi ne kadar erken kısalırsa, kod o kadar çabuk biter. Yine de bunu bir formüle nasıl ekleyeceğime dair hiçbir fikrim yok.
Artefacto'nun dizeleri sıralama yaklaşımının performansı artırdığını buldum. Ekleme
asort($array);
$array = array(array_shift($array), array_pop($array));
daha önce array_reduceperformansı önemli ölçüde artıracaktır.
Ayrıca , bunun daha çok yönlü olan ancak size ortak yolu vermeyen en uzun eşleşen ilk alt dizeyi döndüreceğini unutmayın . Koşmalısın
substr($result, 0, strrpos($result, '/'));
sonuçta. Ve sonra sonucu, değerleri kaldırmak için kullanabilirsiniz
print_r(array_map(function($v) use ($path){
return str_replace($path, '', $v);
}, $array));
hangisi vermeli:
[0] => /lib/abcdedd
[1] => /conf/xyz/
[2] => /conf/abc/def
[3] => /htdocs/xyz
[4] => /lib2/abcdedd
Geri bildirim hoş geldiniz.