โอเคฉันไม่แน่ใจว่านี่เป็นแบบกันกระสุน แต่ฉันคิดว่ามันใช้ได้:
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;
});
ค่านี้จะใช้ค่าแรกในอาร์เรย์เป็นสตริงอ้างอิง จากนั้นมันจะวนซ้ำบนสตริงอ้างอิงและเปรียบเทียบอักขระแต่ละตัวกับอักขระของสตริงที่สองที่ตำแหน่งเดียวกัน ถ้า char ไม่ตรงกันสตริงอ้างอิงจะสั้นลงไปที่ตำแหน่งของ char และเปรียบเทียบสตริงถัดไป ฟังก์ชันจะส่งคืนสตริงการจับคู่ที่สั้นที่สุดจากนั้น
ประสิทธิภาพขึ้นอยู่กับสตริงที่กำหนด ยิ่งสตริงอ้างอิงสั้นลงเร็วเท่าไหร่โค้ดก็จะเสร็จเร็วขึ้นเท่านั้น ฉันไม่รู้ว่าจะใส่มันลงในสูตรได้อย่างไร
ฉันพบว่าวิธีการจัดเรียงสตริงของ Artefacto ช่วยเพิ่มประสิทธิภาพ การเพิ่ม
asort($array);
$array = array(array_shift($array), array_pop($array));
ก่อนที่array_reduce
จะเพิ่มประสิทธิภาพอย่างมีนัยสำคัญ
นอกจากนี้ยังทราบว่านี้จะกลับมาจับคู่ substring เริ่มต้นที่ยาวที่สุดซึ่งมีมากขึ้นหลากหลาย แต่เคยชินให้คุณเส้นทางที่พบบ่อย คุณต้องวิ่ง
substr($result, 0, strrpos($result, '/'));
เกี่ยวกับผลลัพธ์ จากนั้นคุณสามารถใช้ผลลัพธ์เพื่อลบค่าได้
print_r(array_map(function($v) use ($path){
return str_replace($path, '', $v);
}, $array));
ที่ควรให้:
[0] => /lib/abcdedd
[1] => /conf/xyz/
[2] => /conf/abc/def
[3] => /htdocs/xyz
[4] => /lib2/abcdedd
ยินดีรับข้อเสนอแนะ