我有以下几点:xls文件包含一列代码。代码有一个前缀和一个唯一的代码,如下所示:
- VIP-AX757
- VIP-QBHE6
- CODE-IUEF7
- CODE-QDGF3
- VIP-KJQFB
- ...
如何获得字符串或数组的相同部分?如果我得到这样的数组,那就完美了:
- $result[VIP] = 3;
- $result[CODE] = 2;
具有找到的前缀和带有该前缀的单元格总和的数组。但结果目前并不那么重要。
我无法找到如何获得两个字符串相等部分的解决方法:如何比较此"VIP-AX757"
和"VIP-QBHE6"
并得到一个结果:"VIP-"
是相同的前缀/这两个字符串?
希望有人有个主意。 THX!
答案 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中测试:
答案 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,
)