[英]PHP search and merge array elements if they have an identical substring
I have this php array: 我有这个PHP数组:
Array (
[0] =>
"BLABLABLA 08.09.15
00.00.00 BBB BBB X3 0000 00:00 00:00
00.00.00 BBB BBB TP 0000 00:00
FNC015P blablablablablabla blablabla
1 blablabla blablabla
am blablabla blablabla
blablabla blablabla blablabla
blablabla
blablabla
bblablabla blablabla
H999999 blablabla
blablabla
blablabla
blablabla
blablabla "
[1] =>
"00.00.00 BBB BBB X3 0000 00:00 00:00
00.00.00 BBB BBB TP 0000 00:00
FNC015 blablablablablabla blablabla
blablablablablabla blablabla
blablablablablabla blablabla
blablablablablabla blablabla
blablablablablabla
blablablablablabla bla
blablablablablabla blablabla
H999996 blablablablablabla blablabla
blablablablablabla bla
blablablablablabla
blablablablablabla blabla
blablablablablabla blablabla
blablablablablabla blablabla
blablablablablabla blablabla"
[2] =>
"BLABLABLA 08.09.15
00.00.00 BBB BBB X3 0000 00:00 00:00
00.00.00 BBB BBB TP 0000 00:00
FNC234 blablablablablabla blablabla
blablablablablabla blablabla
blablablablablabla blablabla
blablab
blablablablablabla blablablablablablablablabla blablabla
blablab
H999999 blablablablablabla blablabla
blablablablablabla blablablablablablablablabla blablabla"
[3] =>
"BLABLABLA 22.09.15
BLABLABLA
22.09.15 STR FNC X3 2810 14:20 17:25
29.09.15 FNC STR X3 2811 18:15
FNC042 blablablablablabla blablabla
blablablablablabla blablablablablablablablabla blablabla
blablablablablabla blablabla
blablab
H999997 blablablablablabla blablabla"
)
What I want to do is merge into one element the items that have the same H______. 我要做的是将具有相同H______的项目合并到一个元素中。 Like the folowing for the previous example:
就像前面的示例一样:
Array (
[0] =>
"BLABLABLA 08.09.15
00.00.00 BBB BBB X3 0000 00:00 00:00
00.00.00 BBB BBB TP 0000 00:00
FNC015P blablablablablabla blablabla
1 blablabla blablabla
am blablabla blablabla
blablabla blablabla blablabla
blablabla
blablabla
bblablabla blablabla
H999999 blablabla
blablabla
blablabla
blablabla
blablabla
+
"BLABLABLA 08.09.15
00.00.00 BBB BBB X3 0000 00:00 00:00
00.00.00 BBB BBB TP 0000 00:00
FNC234 blablablablablabla blablabla
blablablablablabla blablabla
blablablablablabla blablabla
blablab
blablablablablabla blablablablablablablablabla blablabla
blablab
H999999 blablablablablabla blablabla
blablablablablabla blablablablablablablablabla blablabla"
[1] =>
"00.00.00 BBB BBB X3 0000 00:00 00:00
00.00.00 BBB BBB TP 0000 00:00
FNC015 blablablablablabla blablabla
blablablablablabla blablabla
blablablablablabla blablabla
blablablablablabla blablabla
blablablablablabla
blablablablablabla bla
blablablablablabla blablabla
H999996 blablablablablabla blablabla
blablablablablabla bla
blablablablablabla
blablablablablabla blabla
blablablablablabla blablabla
blablablablablabla blablabla
blablablablablabla blablabla"
[2] =>
"BLABLABLA 22.09.15
BLABLABLA
22.09.15 STR FNC X3 2810 14:20 17:25
29.09.15 FNC STR X3 2811 18:15
FNC042 blablablablablabla blablabla
blablablablablabla blablablablablablablablabla blablabla
blablablablablabla blablabla
blablab
H999997 blablablablablabla blablabla"
)
I have to find the item of the array the substring H_____ and compare with other items and if equal merge. 我必须找到子字符串H_____的数组项,并与其他项进行比较,如果相等,则进行合并。 I found examples of removing duplicates and finding exactly same item, but this is not the case.
我找到了删除重复项并找到完全相同的项目的示例,但事实并非如此。 however unfortunately not always I have the same number of spaces, characters before and after the H______
但是,不幸的是,H ______前后的空格和字符数并不总是相同
I got the regex for the key: "#H\\d+#" and I know that I need to use preg_match. 我得到了密钥的正则表达式:“#H \\ d +#”,并且我知道我需要使用preg_match。
Can anyone help please? 有人可以帮忙吗?
See comments in code. 查看代码中的注释。 The use of
\\b
matches at a word boundary and prevents strings like XXH12345
from being matched. \\b
的使用在单词边界处进行匹配,并防止匹配XXH12345
字符串。
$a = [
"This is one with H11111",
"This is one that has an H22222 in it",
"Tricky one WITH22222 in it",
"This is another H11111, like the first one",
"Here's a line without any number at all",
"Here goes H33333",
"H22222, finally."
];
foreach ($a as $key => $element) {
// Find any string matching H<digits> pattern
if (preg_match('#\bH\d+\b#', $element, $numbers)) {
$number = $numbers[0]; // Remember first found pattern
if (!isset($keys[$number])) { // Do we know this from before?
$keys[$number] = $key; // No, remember the index of this number
}
else {
$a[$keys[$number]] .= " + " . $element; // Yes, append to existing value
unset($a[$key]); // Then remove the appended element
}
}
}
print_r($a);
Output: 输出:
Array
(
[0] => This is one with H11111 + This is another H11111, like the first one
[1] => This is one that has an H22222 in it + H22222, finally.
[2] => Tricky one WITH22222 in it
[4] => Here's a line without any number at all
[5] => Here goes H33333
)
I create some algorithm maybe is not perfect but is work. 我创建了一些算法,也许不是很完美,但是可以工作。
$array = [
'aaaaa aaa H999997 aaa
aaaa aaaa',
'bbbbb bbbb bbbb
bbb H999997 b',
'cccccccccc ccccccccccc H999993
ccccccc cccc'
];
$mergeMap = [];
foreach ($array as $key => $value) {
if (preg_match('/H[0-9]+/', $value, $matches)) {
$searchId = $matches[0];
$mergeMap[$searchId][] = $key;
}
}
$result = [];
foreach ($mergeMap as $key => $indexes) {
$result[$key] = '';
foreach ($indexes as $index) {
$result[$key] .= $array[$index];
}
}
print_r($result);
And output: 并输出:
Array
(
[H999997] => aaaaa aaa H999997 aaa
aaaa aaaabbbbb bbbb bbbb
bbb H999997 b
[H999993] => cccccccccc ccccccccccc H999993
ccccccc cccc
)
PS. PS。 If is any other way (better?), I'll glad to see how this problem can be solved.
如果还有其他方法(更好?),我将很高兴看到如何解决此问题。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.