Ok, nie jestem pewien, czy to jest kuloodporne, ale myślę, że działa:
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;
});
Spowoduje to pobranie pierwszej wartości z tablicy jako łańcucha odniesienia. Następnie przeprowadzi iterację po ciągu referencyjnym i porówna każdy znak ze znakiem drugiego łańcucha w tej samej pozycji. Jeśli znak nie pasuje, ciąg referencyjny zostanie skrócony do pozycji znaku i porównany zostanie następny ciąg. Funkcja zwróci wówczas najkrótszy pasujący ciąg.
Wydajność zależy od podanych strun. Im wcześniej ciąg referencyjny zostanie skrócony, tym szybciej zakończy się kod. Naprawdę nie mam pojęcia, jak to ująć w formule.
Odkryłem, że podejście Artefacto do sortowania strun zwiększa wydajność. Dodawanie
asort($array);
$array = array(array_shift($array), array_pop($array));
przed array_reduce
znacznie zwiększy wydajność.
Zwróć również uwagę, że zwróci to najdłuższy pasujący podciąg początkowy , który jest bardziej wszechstronny, ale nie daje wspólnej ścieżki . Musisz biec
substr($result, 0, strrpos($result, '/'));
na wynik. Następnie możesz użyć wyniku, aby usunąć wartości
print_r(array_map(function($v) use ($path){
return str_replace($path, '', $v);
}, $array));
co powinno dać:
[0] => /lib/abcdedd
[1] => /conf/xyz/
[2] => /conf/abc/def
[3] => /htdocs/xyz
[4] => /lib2/abcdedd
Opinie mile widziane.