2015-08-26 57 views
1

我有这个PHP数组: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

请参阅代码中的注释。使用\bword 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 
) 
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。如果有其他方式(更好?),我很高兴看到这个问题如何解决。

相关问题