2015-08-26 59 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。如果有其他方式(更好?),我很高興看到這個問題如何解決。

相關問題