Группировать строки по сходству / подстроке

PHP

Привет, я боролся с этой проблемой некоторое время и не могу найти решение этой проблемы, и мне было интересно, если кто-нибудь может помочь.

Мне нужно сгруппировать похожие строки, например:

вход

Тонкий алюминиевый HDMI-вывод, 1м, синий
Тонкий алюминиевый HDMI-вывод, 2м, синий
Тонкий алюминиевый HDMI-вывод, 3м, синий
Наушники Frozen Kids с ограничителем громкости
Штекер XLR к гнезду, 3м
Штепсельная вилка XLR к гнезду, 6м
Наушники Monster High Kids с ограничителем громкости
Детские наушники TMNT с ограничителем громкости
Детские наушники Batman с ограничителем громкости
1-канальная настенная щетка для ввода кабеля, белые / белые щетки, 50 х 45 мм
2-канальная настенная щетка для ввода кабеля, белые / белые щетки, 50 х 100 мм
1-канальная настенная щетка для ввода кабеля, белые / черные щетки, 50 х 45 мм
2-канальная настенная щетка для ввода кабеля белого / черного цвета, 50 х 100 мм
Тонкий алюминиевый HDMI-вывод, 5м, синий
Тонкий алюминиевый HDMI-вывод, 7,5 м, синий
6,35 мм (1/4 «) монофонический штекер для гитары, 5м оранжевый
Штекер XLR к гнезду, 0,5м
Штекер XLR к разъему, 1м
Штекер XLR к гнезду, 2м

Выход (сгруппированный в массив)

Тонкий алюминиевый HDMI-вывод, 1м, синий
Тонкий алюминиевый HDMI-вывод, 2м, синий
Тонкий алюминиевый HDMI-вывод, 3м, синий
Тонкий алюминиевый HDMI-вывод, 5м, синий
Тонкий алюминиевый HDMI-вывод, 7,5 м, синий

Штекер XLR к гнезду, 0,5м
Штекер XLR к разъему, 1м
Штекер XLR к гнезду, 2м
Штекер XLR к гнезду, 3м
Штепсельная вилка XLR к гнезду, 6м

1-канальная настенная щетка для ввода кабеля, белые / белые щетки, 50 х 45 мм
2-канальная настенная щетка для ввода кабеля, белые / белые щетки, 50 х 100 мм
1-канальная настенная щетка для ввода кабеля, белые / черные щетки, 50 х 45 мм
2-канальная настенная щетка для ввода кабеля белого / черного цвета, 50 х 100 мм

Наушники Frozen Kids с ограничителем громкости
Наушники Monster High Kids с ограничителем громкости
Детские наушники TMNT с ограничителем громкости
Детские наушники Batman с ограничителем громкости

6,35 мм (1/4 «) монофонический штекер для гитары, 5м оранжевый

-1

Решение

Обновление: я нашел лучшее решение

Я никогда не играл с функцией php Similar_text (), но я решил попробовать …

$array = explode(PHP_EOL,'Slim Aluminium HDMI Lead, 1m Blue
Slim Aluminium HDMI Lead, 2m Blue
Slim Aluminium HDMI Lead, 3m Blue
Frozen Kids Headphones with Volume Limiter
XLR Plug to Socket Lead, 3m
XLR Plug to Socket Lead, 6m
Monster High Kids Headphones with Volume Limiter
TMNT Kids Headphones with Volume Limiter
Batman Kids Headphones with Volume Limiter
1-Gang Cable Entry Brush Wall Plate White/White Brushes 50 x 45mm
2-Gang Cable Entry Brush Wall Plate White/White Brushes 50 x 100mm
1-Gang Cable Entry Brush Wall Plate White/Black Brushes 50 x 45mm
2-Gang Cable Entry Brush Wall Plate White/Black Brushes 50 x 100mm
Slim Aluminium HDMI Lead, 5m Blue
Slim Aluminium HDMI Lead, 7.5m Blue
6.35mm (1/4") Mono Jack to Jack Guitar Lead, 5m Orange
XLR Plug to Socket Lead, 0.5m
XLR Plug to Socket Lead, 1m
XLR Plug to Socket Lead, 2m');

$output = array();
while( empty( $array ) === false )
{
$currentWord = array_shift( $array );
$currentGroup = array( $currentWord );
foreach( $array as $index => $word )
{
if( similar_text( $word, $currentWord, $percentage ) and $percentage > 80 )
{
$currentGroup[] = $word;
unset( $array[ $index ] );
}
}
$output[] = $currentGroup;
}

print_r($output);

// Array
// (
//     [0] => Array
//         (
//             [0] => Slim Aluminium HDMI Lead, 1m Blue
//             [1] => Slim Aluminium HDMI Lead, 2m Blue
//             [2] => Slim Aluminium HDMI Lead, 3m Blue
//             [3] => Slim Aluminium HDMI Lead, 5m Blue
//             [4] => Slim Aluminium HDMI Lead, 7.5m Blue
//         )
//
//     [1] => Array
//         (
//             [0] => Frozen Kids Headphones with Volume Limiter
//             [1] => Monster High Kids Headphones with Volume Limiter
//             [2] => TMNT Kids Headphones with Volume Limiter
//             [3] => Batman Kids Headphones with Volume Limiter
//         )
//
//     [2] => Array
//         (
//             [0] => XLR Plug to Socket Lead, 3m
//             [1] => XLR Plug to Socket Lead, 6m
//             [2] => XLR Plug to Socket Lead, 0.5m
//             [3] => XLR Plug to Socket Lead, 1m
//             [4] => XLR Plug to Socket Lead, 2m
//         )
//
//     [3] => Array
//         (
//             [0] => 1-Gang Cable Entry Brush Wall Plate White/White Brushes 50 x 45mm
//             [1] => 2-Gang Cable Entry Brush Wall Plate White/White Brushes 50 x 100mm
//             [2] => 1-Gang Cable Entry Brush Wall Plate White/Black Brushes 50 x 45mm
//             [4] => 2-Gang Cable Entry Brush Wall Plate White/Black Brushes 50 x 100mm
//         )
//
//     [4] => Array
//         (
//             [0] => 6.35mm (1/4") Mono Jack to Jack Guitar Lead, 5m Orange
//         )
//
// )

Ассортимент массива

$products = array(
array('id'=>'A','name'=>'Slim Aluminium HDMI Lead, 1m Blue'),
array('id'=>'B','name'=>'Slim Aluminium HDMI Lead, 2m Blue'),
array('id'=>'C','name'=>'Slim Aluminium HDMI Lead, 3m Blue'),
array('id'=>'D','name'=>'1-Gang Cable Entry Brush Wall Plate White/White Brushes 50 x 45mm'),
array('id'=>'E','name'=>'2-Gang Cable Entry Brush Wall Plate White/White Brushes 50 x 100mm'),
array('id'=>'F','name'=>'1-Gang Cable Entry Brush Wall Plate White/Black Brushes 50 x 45mm'),
array('id'=>'G','name'=>'2-Gang Cable Entry Brush Wall Plate White/Black Brushes 50 x 100mm'),
array('id'=>'H','name'=>'Slim Aluminium HDMI Lead, 5m Blue'),
array('id'=>'I','name'=>'Slim Aluminium HDMI Lead, 7.5m Blue')
);
$output = array();
while( empty( $products) === false )
{
$currentProduct = array_shift( $products );
$currentGroup = array( $currentProduct );
foreach( $products as $index => $product )
{
if( similar_text( $product['name'], $currentProduct['name'], $percentage ) and $percentage > 80 )
{
$currentGroup[] = $product;
unset( $products[ $index ] );
}
}
$output[] = $currentGroup;
}
print_r($output);
3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]