Oke, saya tidak yakin ini anti peluru, tapi menurut saya ini berhasil:
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;
});
Ini akan mengambil nilai pertama dalam array sebagai string referensi. Kemudian itu akan mengulangi string referensi dan membandingkan setiap karakter dengan karakter dari string kedua pada posisi yang sama. Jika sebuah karakter tidak cocok, string referensi akan disingkat menjadi posisi karakter tersebut dan string berikutnya akan dibandingkan. Fungsi ini akan mengembalikan string pencocokan terpendek.
Performa tergantung pada string yang diberikan. Semakin awal string referensi semakin pendek, semakin cepat kode akan selesai. Saya benar-benar tidak tahu bagaimana memasukkannya ke dalam formula.
Saya menemukan bahwa pendekatan Artefacto untuk mengurutkan string meningkatkan kinerja. Menambahkan
asort($array);
$array = array(array_shift($array), array_pop($array));
sebelum array_reduce
secara signifikan meningkatkan kinerja.
Perhatikan juga bahwa ini akan mengembalikan substring awal yang paling lama cocok , yang lebih serbaguna tetapi tidak akan memberi Anda jalur yang sama . Kamu harus lari
substr($result, 0, strrpos($result, '/'));
pada hasil. Dan kemudian Anda dapat menggunakan hasilnya untuk menghapus nilainya
print_r(array_map(function($v) use ($path){
return str_replace($path, '', $v);
}, $array));
yang seharusnya memberi:
[0] => /lib/abcdedd
[1] => /conf/xyz/
[2] => /conf/abc/def
[3] => /htdocs/xyz
[4] => /lib2/abcdedd
Umpan balik diterima.