PHP поиск и объединение элементов массива, если они имеют одинаковую подстроку

1

У меня есть этот 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.

Может ли кто-нибудь помочь?

Теги:
arrays
foreach
preg-match

2 ответа

2
Лучший ответ

См. Комментарии в коде. Использование \b соответствует границе слова и предотвращает XXH12345 строк, таких как 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 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 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. Если любой другой способ (лучше?), Я рад видеть, как эта проблема может быть решена.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню