代码之家  ›  专栏  ›  技术社区  ›  Miguel Sousa

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

  •  1
  • Miguel Sousa  · 技术社区  · 10 年前

    我有一个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 回复  |  直到 10 年前
        1
  •  2
  •   mhall    10 年前

    请参见代码中的注释。使用 \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
    )
    
        2
  •  1
  •   Piotr Olaszewski    10 年前

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

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

    推荐文章