Ok, ich bin nicht sicher, ob dies kugelsicher ist, aber ich denke, es funktioniert:
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;
});
Dadurch wird der erste Wert im Array als Referenzzeichenfolge verwendet. Dann wird die Referenzzeichenfolge durchlaufen und jedes Zeichen mit dem Zeichen der zweiten Zeichenfolge an derselben Position verglichen. Wenn ein Zeichen nicht übereinstimmt, wird die Referenzzeichenfolge auf die Position des Zeichens gekürzt und die nächste Zeichenfolge verglichen. Die Funktion gibt dann die kürzeste übereinstimmende Zeichenfolge zurück.
Die Leistung hängt von den angegebenen Zeichenfolgen ab. Je früher die Referenzzeichenfolge kürzer wird, desto schneller wird der Code beendet. Ich habe wirklich keine Ahnung, wie ich das in eine Formel einfügen soll.
Ich fand heraus, dass Artefactos Ansatz zum Sortieren der Saiten die Leistung erhöht. Hinzufügen
asort($array);
$array = array(array_shift($array), array_pop($array));
vor dem array_reduce
wird die Leistung deutlich steigern.
Beachten Sie auch, dass dies die längste übereinstimmende anfängliche Teilzeichenfolge zurückgibt , die vielseitiger ist, Ihnen jedoch nicht den gemeinsamen Pfad gibt . Du musst rennen
substr($result, 0, strrpos($result, '/'));
auf das Ergebnis. Und dann können Sie das Ergebnis verwenden, um die Werte zu entfernen
print_r(array_map(function($v) use ($path){
return str_replace($path, '', $v);
}, $array));
was geben sollte:
[0] => /lib/abcdedd
[1] => /conf/xyz/
[2] => /conf/abc/def
[3] => /htdocs/xyz
[4] => /lib2/abcdedd
Feedback willkommen.