PHP 搜索并合并具有相同子字符串的数组元素

PHP search and merge array elements if they have an identical substring

我有这个 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"
)

我想做的是将具有相同 H______ 的项目合并到一个元素中。就像前面的例子一样:

 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"
)

我必须找到子字符串 H_____ 的数组项并与其他项进行比较,如果相等则合并。我找到了删除重复项并找到完全相同项目的示例,但事实并非如此。 然而不幸的是,我在 H______

前后的空格、字符数量并不总是相同

我得到了密钥的正则表达式:“#H\d+#”并且我知道我需要使用 preg_match.

有人可以帮忙吗?

我创建了一些算法,可能并不完美,但很有效。

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

并输出:

Array
(
    [H999997] => aaaaa aaa H999997 aaa
            aaaa aaaabbbbb bbbb bbbb
            bbb H999997 b
    [H999993] => cccccccccc ccccccccccc H999993
            ccccccc cccc
)

PS。如果有任何其他方式(更好?),我很高兴看到这个问题是如何解决的。

查看代码中的注释。使用 \b 匹配 word boundary 并防止匹配 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);

输出:

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
)