简体   繁体   English

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM