好的,我不确定这是防弹的,但是我认为它可以工作:
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在相同位置进行比较。如果一个字符不匹配,则将参考字符串缩短到该字符的位置,然后比较下一个字符串。然后,该函数将返回最短的匹配字符串。
性能取决于给定的字符串。参考字符串越短,代码完成的速度就越快。我真的不知道如何将其放入公式中。
我发现Artefacto的字符串排序方法提高了性能。新增中
asort($array);
$array = array(array_shift($array), array_pop($array));
之前 array_reduce
会显著提高性能。
另请注意,这将返回最长匹配的初始子字符串,该子字符串更通用,但不会为您提供通用路径。你必须跑
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
欢迎反馈。