Ok, non sono sicuro che sia a prova di proiettile, ma penso che funzioni:
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;
});
Questo prenderà il primo valore nell'array come stringa di riferimento. Quindi itererà sulla stringa di riferimento e confronterà ogni carattere con il carattere della seconda stringa nella stessa posizione. Se un carattere non corrisponde, la stringa di riferimento verrà accorciata alla posizione del carattere e verrà confrontata la stringa successiva. La funzione restituirà quindi la stringa corrispondente più breve.
Le prestazioni dipendono dalle stringhe fornite. Prima si accorcia la stringa di riferimento, più velocemente finirà il codice. Non ho davvero idea di come metterlo in una formula.
Ho scoperto che l'approccio di Artefacto per ordinare le corde aumenta le prestazioni. Aggiunta
asort($array);
$array = array(array_shift($array), array_pop($array));
prima che array_reduce
aumenterà significativamente le prestazioni.
Nota anche che questo restituirà la sottostringa iniziale corrispondente più lunga , che è più versatile ma non ti darà il percorso comune . Devi correre
substr($result, 0, strrpos($result, '/'));
sul risultato. E poi puoi usare il risultato per rimuovere i valori
print_r(array_map(function($v) use ($path){
return str_replace($path, '', $v);
}, $array));
che dovrebbe dare:
[0] => /lib/abcdedd
[1] => /conf/xyz/
[2] => /conf/abc/def
[3] => /htdocs/xyz
[4] => /lib2/abcdedd
Feedback benvenuti.