问题描述
给定有n个值的数组,例如:
Given an array with n values, for example:
$arr[] = 'ABCDEFABC';
$arr[] = 'ABCDEFDEF';
$arr[] = 'ABCDEFGHI';
$arr[] = 'ABCDEFJKL';
我怎样才能找到适合所有(或大多数,在这个例子波纹管)的初始段值,在这种情况下ABCDEF?
how can I find the initial segment that matches all (or most, in the example bellow) values, in this case ABCDEF?
编辑2:不可以解决,请参阅回答
更糟糕的是给下面的数组:
Even worse, given the following array:
$arr[] = 'ABCDEFABC';
$arr[] = 'ABCDEFDEF';
$arr[] = 'ABCDEFGHI';
$arr[] = 'ABCDEFJKL';
$arr[] = 'DEFABCABC';
$arr[] = 'DEFABCDEF';
$arr[] = 'DEFABCGHI';
$arr[] = 'DEFABCJKL';
我如何能得到:
$result[] = 'ABCDEF';
$result[] = 'DEFABC';
这是一个棘手......我试图做到的是()(这里的面具的顺序事情呢,谢谢捷思锐)应用到阵列。
This one is tricky... What I'm trying to accomplish is the behavior of strspn() (where the order of the "mask" does matter, thank you Zed) applied to arrays.
编辑:为了澄清了一点东西我想要的是找到所有存在于同一指数在阵列中的所有值的常用字母(不知道这使得它更容易或不!) 。在这个第二个问题,因为所有的字符没有在其他值的索引匹配我需要匹配相同的初始段的最大数(在此情况下,2:ABCDEF和DEFABC)。强>
推荐答案
如果我理解正确的话,你要确定一套给定一组字符串的最长公共prefixes的。
If I understand correctly, you're trying to determine the set of longest common prefixes given a set of strings.
打破它,任何两个字符串之间的共享preFIX可能被发现为
Breaking it down, the shared prefix between any two strings may be found as
function longestCommonPrefix($str1, $str2) {
$minLen = min(strlen($str1), strlen($str2));
for ($i = 0; $i < $minLen; $i++) {
if ($str1[$i] != $str2[$i]) {
return substr($str1, 0, $i);
}
}
return substr($str1, 0, $minLen);
}
一种方式来获得一套prefixes的然后可以:
One way to get the set of prefixes could then be:
function longestCommonPrefixes($arr) {
sort($arr);
$prefixes = array();
for ($i = 0; $i < count($arr); $i++) {
for ($j = $i+1; $j < count($arr); $j++) {
$prefix = longestCommonPrefix($arr[$i], $arr[$j]);
if ($prefix == "") break;
$prefixes[$prefix] = true;
}
}
return array_keys($prefixes);
}
注意,返回prefixes可能是对方的prefixes。也就是说,它是可能的结果,包含了一组字符串,如阵列(A,AA,AAA)
。
全部放在一起:
$arr = array();
$arr[] = 'ABCDEFABC';
$arr[] = 'ABCDEFDEF';
$arr[] = 'ABCDEFGHI';
$arr[] = 'ABCDEFJKL';
$arr[] = 'DEFABCABC';
$arr[] = 'DEFABCDEF';
$arr[] = 'DEFABCGHI';
$arr[] = 'DEFABCJKL';
print_r(longestCommonPrefixes($arr));
收益
Array
(
[0] => ABCDEF
[1] => DEFABC
)
这篇关于查找阵列初始段匹配掩码长度的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!