Ok, no estoy seguro de que esto es a prueba de balas, pero creo que funciona:
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;
});
Esto tomará el primer valor en la matriz como cadena de referencia. Luego iterará sobre la cadena de referencia y comparará cada char con el carácter de la segunda cuerda en la misma posición. Si un char no concuerda, la cadena de referencia se acortará a la posición del char y se comparará la siguiente cuerda. La función devolverá la cadena de coincidencia más corta a continuación.
El rendimiento depende de las cadenas dadas. Cuanto antes se acorte la cadena de referencia, más rápido terminará el código. Sin embargo, realmente no tengo ni idea de cómo poner eso en una fórmula.
Encontré que el enfoque de Artefacto para ordenar las cadenas aumenta el rendimiento. Añadiendo
asort($array);
$array = array(array_shift($array), array_pop($array));
antes de la array_reduce
aumentará significativamente el rendimiento.
También tenga en cuenta que esto devolverá la subcadena más larga a juego inicial , que es más versátil, pero no le dará el camino común . Debe ejecutar
substr($result, 0, strrpos($result, '/'));
en el resultado. Y a continuación, puede utilizar el resultado para eliminar los valores
print_r(array_map(function($v) use ($path){
return str_replace($path, '', $v);
}, $array));
que debe dar:
[0] => /lib/abcdedd
[1] => /conf/xyz/
[2] => /conf/abc/def
[3] => /htdocs/xyz
[4] => /lib2/abcdedd
Evaluación de bienvenida.
1 Me encanta el título de la pregunta. – BoltClock
Esto podría valer la pena intentarlo: http://en.wikibooks.org/wiki/Algorithm_implementation/Strings/Longest_common_substring (lo probé y funciona). –
Awwww! Tal cantidad de entrada brillante. Tomaré uno para resolver mi problema, pero creo que para elegir realmente una respuesta aceptada y justificada, tendré que comparar las soluciones. Puede tomar un tiempo hasta que logre hacer eso, pero ciertamente lo haré. –