Гаразд, я не впевнений, що це куленепробивна, але я думаю, що це працює:
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 як значно підвищиться продуктивність.
Також зауважте, що це поверне найдовший збіг початкової підрядки , який є більш універсальним, але не дасть вам загального шляху . Ви повинні бігти
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
Відгуки Ласкаво просимо.