좋아, 이것이 방탄인지 확실하지 않지만 작동한다고 생각합니다.
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;
});
이것은 배열의 첫 번째 값을 참조 문자열로 사용합니다. 그런 다음 참조 문자열을 반복하고 각 문자를 동일한 위치에있는 두 번째 문자열의 문자와 비교합니다. 문자가 일치하지 않으면 참조 문자열이 문자 위치로 단축되고 다음 문자열이 비교됩니다. 이 함수는 일치하는 가장 짧은 문자열을 반환합니다.
성능은 주어진 문자열에 따라 다릅니다. 참조 문자열이 짧아 질수록 코드가 더 빨리 완료됩니다. 나는 그것을 공식에 넣는 방법을 정말로 모른다.
문자열을 정렬하는 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
피드백을 환영합니다.