微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

php-查找数组上初始段匹配掩码的长度

给定一个具有n个值的数组,例如:

$arr[] = 'ABCDEFABC';
$arr[] = 'ABCDEFDEF';
$arr[] = 'ABCDEFGHI';
$arr[] = 'ABCDEFJKL';

如何找到与所有(或以下示例中的大多数)值(在这种情况下为ABCDEF)匹配的初始段?

编辑2:不解决,请参阅答案.

更糟糕的是,给定以下数组:

$arr[] = 'ABCDEFABC';
$arr[] = 'ABCDEFDEF';
$arr[] = 'ABCDEFGHI';
$arr[] = 'ABCDEFJKL';
$arr[] = 'DEFABCABC';
$arr[] = 'DEFABCDEF';
$arr[] = 'DEFABCGHI';
$arr[] = 'DEFABCJKL';

我怎样才能得到:

$result[] = 'ABCDEF';
$result[] = 'DEFABC';

这是一个棘手的问题…我要完成的是将strspn()的行为(“掩码”的顺序很重要,谢谢Zed)应用于数组的行为.

编辑:为了澄清一点,我想要的是在数组的所有值中找到存在于同一索引中的所有通用字母(不确定这是否使它更容易!).在第二个问题中,由于所有字符都与其他值中的索引不匹配,因此我需要匹配相同初始段的最大数量(在本例中为2:ABCDEF和DEFABC).

解决方法:

如果我理解正确,则您正在尝试根据给定的字符串来确定最长的公共前缀集.

分解后,可以发现任意两个字符串之间的共享前缀为

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);
}

然后,获取前缀集的一种方法可能是:

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);
}

请注意,返回的前缀可以是彼此的前缀.也就是说,结果可能包含一组字符串,例如array(‘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
)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐