PHP搜索并合并数组元素(如果它们具有相同的子字符串)

时间:2015-08-26 06:21:30

标签: php arrays regex foreach preg-match

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

有人可以帮忙吗?

2 个答案:

答案 0 :(得分:2)

在代码中查看评论。在word boundary使用\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);

输出:

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
)

答案 1 :(得分:1)

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

$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。如果有其他方式(更好?),我很高兴看到这个问题是如何解决的。