わかりました、これが完全なものかどうかはわかりませんが、うまくいくと思います。
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;
});
これは、配列の最初の値を参照文字列として使用します。次に、参照文字列を反復処理し、各文字を同じ位置にある2番目の文字列の文字と比較します。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
フィードバックを歓迎します。