假设我有一个看起来像这样的类型列表:
$genres = array(
'soul',
'soul jazz',
'blues',
'jazz blues',
'rock',
'indie',
'cool jazz',
'rock-blues');
...And等,用于762个值。我如何将这些类型组织成类别?
例如,我希望蓝调类别包含“蓝调”、“爵士蓝调”和“摇滚乐”。我希望爵士乐类别包含“灵魂爵士乐”、“爵士蓝调”和“酷爵士乐”。
任何和所有的帮助都是感激的。
发布于 2013-12-27 01:53:55
使用preg_match
将是解决问题的最佳方法之一。
<?php
$categories = array("blues", "jazz");
$genres = array("soul", "soul jazz", "blues", "jazz blues", "rock", "indie", "cool jazz", "rock-blues");
$arr = array();
$others = array();
foreach($genres as $genre){
$num = 0;
foreach($categories as $category){
if(preg_match("/\\b".$category."\\b/", $genre)){
$arr[$category][] = $genre;
$num = 1;
}
}
if($num == 0){
$others[] = $genre;
}
}
ksort($arr);
$arr["others"] = $others;
unset($genre, $num, $category, $others);
print_r($arr);
?>
其结果将是:
Array
(
[blues] => Array
(
[0] => blues
[1] => jazz blues
[2] => rock-blues
)
[jazz] => Array
(
[0] => soul jazz
[1] => jazz blues
[2] => cool jazz
)
[others] => Array
(
[0] => soul
[1] => rock
[2] => indie
)
)
发布于 2013-12-27 01:33:34
给了一些种子:
$seeds = array('blues','jazz',...);
然后计算它最接近的位置:
foreach($genres as $v) {
$similarity = 0;
$k = 0;
foreach($seeds as $kk=>$vv) {
$current = similar_text($v,$vv);
if ($current>$similarity) {
$similarity = $current;
$k=$kk;
}
}
$categories[$k][]=$v;
}
在这一点上,您的$geners
标记在$categories
中;
Array
(
[blues] => Array
(
[0] => soul
[1] => blues
[2] => jazz blues
[3] => rock
[4] => indie
[5] => rock-blues
)
[jazz] => Array
(
[0] => soul jazz
[1] => cool jazz
)
)
代码页上经过测试的代码:http://codepad.org/HCPcO4Iy
PS。很明显,如果你有这两个种子(布鲁斯和吉兹),然后你必须将“天哪蓝调”这一类型聚在一起,那么它可能会被分配给一个或另一个,而没有任何逻辑。
https://stackoverflow.com/questions/20793501
复制相似问题