Ok, je ne suis pas sûr que ce soit à l'épreuve des balles, mais je pense que cela fonctionne:
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;
});
Cela prendra la première valeur du tableau comme chaîne de référence. Ensuite, il itérera sur la chaîne de référence et comparera chaque caractère avec le caractère de la deuxième chaîne à la même position. Si un caractère ne correspond pas, la chaîne de référence sera raccourcie à la position du caractère et la chaîne suivante est comparée. La fonction renverra alors la chaîne correspondante la plus courte.
Les performances dépendent des chaînes données. Plus la chaîne de référence raccourcit tôt, plus le code se terminera rapidement. Je ne sais vraiment pas comment mettre cela dans une formule.
J'ai trouvé que l'approche d'Artefacto pour trier les cordes augmente les performances. Ajouter
asort($array);
$array = array(array_shift($array), array_pop($array));
avant le array_reduce
augmentera considérablement les performances.
Notez également que cela renverra la plus longue sous - chaîne initiale correspondante , qui est plus polyvalente mais ne vous donnera pas le chemin commun . Tu dois courir
substr($result, 0, strrpos($result, '/'));
sur le résultat. Et puis vous pouvez utiliser le résultat pour supprimer les valeurs
print_r(array_map(function($v) use ($path){
return str_replace($path, '', $v);
}, $array));
ce qui devrait donner:
[0] => /lib/abcdedd
[1] => /conf/xyz/
[2] => /conf/abc/def
[3] => /htdocs/xyz
[4] => /lib2/abcdedd
Vos commentaires sont les bienvenus.