Хорошо, я не уверен, что это пуленепробиваемое, но я думаю, что это работает:
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
Обратная связь приветствуется.