如何获得多个字符串/数组的相等部分?

时间:2014-07-10 10:28:34

标签: php arrays string compare

我有以下几点:xls文件包含一列代码。代码有一个前缀和一个唯一的代码,如下所示:

- VIP-AX757
- VIP-QBHE6
- CODE-IUEF7
- CODE-QDGF3
- VIP-KJQFB
- ...

如何获得字符串或数组的相同部分?如果我得到这样的数组,那就完美了:

- $result[VIP] = 3;
- $result[CODE] = 2;

具有找到的前缀和带有该前缀的单元格总和的数组。但结果目前并不那么重要。

我无法找到如何获得两个字符串相等部分的解决方法:如何比较此"VIP-AX757""VIP-QBHE6"并得到一个结果:"VIP-"是相同的前缀/这两个字符串?

希望有人有个主意。 THX!

4 个答案:

答案 0 :(得分:1)

-drum roll-单线的时间!

$result = array_count_values(array_map(function($v) {list($a) = explode("-",$v); return $a;},$input));

(假设$input是您的代码数组)

如果您使用的是PHP 5.4或更新版本(您应该使用),那么:

$result = array_count_values(array_map(function($v) {return explode("-",$v)[0];},$input));

在PHP CLI中测试:

screenshot of result

答案 1 :(得分:0)

如果前缀后跟一个' - ',那么你可以这样做: -

foreach ($codes as $code) {
    $tmp = explode("-",$code);
    $result[$tmp[0]] += 1;
}
print_r($result);

答案 2 :(得分:0)

取决于数据的可变性,但类似于:

preg_match_all('/^([^-]+)/m', $string, $matches);
$result = array_count_values($matches[1]);

print_r($result);

如果您不知道前缀后面有-但前缀总是字母,那么:

preg_match_all('/^([A-Z]+)/im', $string, $matches);
$result = array_count_values($matches[1]);

否则,如果前缀不是分隔符,则必须准确定义前缀可以包含的内容。

答案 3 :(得分:0)

由于您通过对Niet的评论声明您没有可靠的分隔符,因此我们只能编写一个模式,根据每个行中的位置来识别您的目标子字符串。

我建议preg_match_all()没有捕获组,行锚的开头和多行模式修饰符(m)。

我写了一个preg_split()替代品,但由于我处理换行的方式,这种模式有点“笨拙”。

代码:(Demo

$string = 'VIP-AX757
VIP-QBHE6
CODE-IUEF7
CODE-QDGF3
VIP-KJQFB';

var_export(array_count_values(preg_match_all('~^[A-Z]+~m', $string, $out) ? $out[0] : []));
echo "\n\n";
var_export(array_count_values(preg_split('~[^A-Z][^\r\n]+\R?~', $string, -1, PREG_SPLIT_NO_EMPTY)));

输出:

array (
  'VIP' => 3,
  'CODE' => 2,
)

array (
  'VIP' => 3,
  'CODE' => 2,
)