PHP - 按相似性/子字符串对字符串进行分组
PHP - Group Strings By Similarity / Substring
PHP
嗨,我一直在为这个问题苦苦挣扎,但找不到解决方案,想知道是否有人可以提供帮助。
我需要对类似的字符串进行分组,例如:
输入
细长铝制 HDMI 引线,1m 蓝色
细长铝制 HDMI 引线,2m 蓝色
细长铝制 HDMI 引线,3m 蓝色
带音量限制器的冰雪奇缘儿童耳机
XLR 插头到插座导线,3m
XLR 插头到插座导线,6m
带音量限制器的 Monster High 儿童耳机
带音量限制器的 TMNT 儿童耳机
带音量限制器的蝙蝠侠儿童耳机
1 单元电缆引入刷壁板 White/White 刷子 50 x 45mm
2 单元电缆引入刷壁板 White/White 刷子 50 x 100mm
1 单元电缆引入刷壁板 White/Black 刷子 50 x 45mm
2 单元电缆引入刷壁板 White/Black 刷子 50 x 100mm
细长铝制 HDMI 引线,5m 蓝色
细长铝制 HDMI 导线,7.5m 蓝色
6.35 毫米(1/4 英寸)单声道插孔到插孔吉他引线,5m 橙色
XLR 插头到插座引线,0.5m
XLR 插头到插座导线,1m
XLR 插头到插座导线,2m
输出(按数组分组)
细长铝制 HDMI 引线,1m 蓝色
细长铝制 HDMI 引线,2m 蓝色
细长铝制 HDMI 引线,3m 蓝色
细长铝制 HDMI 引线,5m 蓝色
细长铝制 HDMI 导线,7.5m 蓝色
XLR 插头到插座导线,0.5m
XLR 插头到插座导线,1m
XLR 插头到插座导线,2m
XLR 插头到插座导线,3m
XLR 插头到插座导线,6m
1 组电缆引入刷壁板 White/White 刷子 50 x 45mm
2 单元电缆引入刷壁板 White/White 刷子 50 x 100mm
1 单元电缆引入刷壁板 White/Black 刷子 50 x 45mm
2 单元电缆引入刷壁板 White/Black 刷子 50 x 100mm
带音量限制器的冰雪奇缘儿童耳机
带音量限制器的 Monster High 儿童耳机
带音量限制器的 TMNT 儿童耳机
带音量限制器的蝙蝠侠儿童耳机
6.35mm (1/4") 单声道插孔到插孔吉他引线,5m 橙色
更新:我找到了更好的解决方案
我从未玩过 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);
PHP
嗨,我一直在为这个问题苦苦挣扎,但找不到解决方案,想知道是否有人可以提供帮助。
我需要对类似的字符串进行分组,例如:
输入
细长铝制 HDMI 引线,1m 蓝色
细长铝制 HDMI 引线,2m 蓝色
细长铝制 HDMI 引线,3m 蓝色
带音量限制器的冰雪奇缘儿童耳机
XLR 插头到插座导线,3m
XLR 插头到插座导线,6m
带音量限制器的 Monster High 儿童耳机
带音量限制器的 TMNT 儿童耳机
带音量限制器的蝙蝠侠儿童耳机
1 单元电缆引入刷壁板 White/White 刷子 50 x 45mm
2 单元电缆引入刷壁板 White/White 刷子 50 x 100mm
1 单元电缆引入刷壁板 White/Black 刷子 50 x 45mm
2 单元电缆引入刷壁板 White/Black 刷子 50 x 100mm
细长铝制 HDMI 引线,5m 蓝色
细长铝制 HDMI 导线,7.5m 蓝色
6.35 毫米(1/4 英寸)单声道插孔到插孔吉他引线,5m 橙色
XLR 插头到插座引线,0.5m
XLR 插头到插座导线,1m
XLR 插头到插座导线,2m
输出(按数组分组)
细长铝制 HDMI 引线,1m 蓝色
细长铝制 HDMI 引线,2m 蓝色
细长铝制 HDMI 引线,3m 蓝色
细长铝制 HDMI 引线,5m 蓝色
细长铝制 HDMI 导线,7.5m 蓝色
XLR 插头到插座导线,0.5m
XLR 插头到插座导线,1m
XLR 插头到插座导线,2m
XLR 插头到插座导线,3m
XLR 插头到插座导线,6m
1 组电缆引入刷壁板 White/White 刷子 50 x 45mm
2 单元电缆引入刷壁板 White/White 刷子 50 x 100mm
1 单元电缆引入刷壁板 White/Black 刷子 50 x 45mm
2 单元电缆引入刷壁板 White/Black 刷子 50 x 100mm
带音量限制器的冰雪奇缘儿童耳机
带音量限制器的 Monster High 儿童耳机
带音量限制器的 TMNT 儿童耳机
带音量限制器的蝙蝠侠儿童耳机
6.35mm (1/4") 单声道插孔到插孔吉他引线,5m 橙色
更新:我找到了更好的解决方案
我从未玩过 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);