【发布时间】:2011-06-18 00:09:31
【问题描述】:
我希望 $Array2 中的歌曲标题按照 $Array1 的相同顺序排序,而不会丢失 $Array2 中的值。 $Array2 中的值应遵循 $Array2 中每个键的新顺序。我相信我提供的当前功能是一个坚实的开始......
我有两个数组(请注意每个数组的区别):
- $Array1 是用户输入的数据。
- $Array2 是查找的数据 类似于的外部源 $Array1 但不精确。
例如...
$Array1 包含:
大批 ( [0] => 3oh!3 - 不要相信我 [1] => 泰勒斯威夫特 - 你属于我 [2] => 肖恩·金斯顿 - 燃烧的火焰 [3] => 绿日 - 了解你的敌人 [4] => 凯莉克拉克森 - 走了 )$Array2 包含:
大批 ( [泰勒斯威夫特 - 你属于我] => bbbbbb [肖恩金斯顿 - 燃烧] => cccccc [凯莉克拉克森 - 走了] => eeeeee [3OH!3- Don't Trust Me 歌词] => aaaaaa [绿日知敌官方] => dddddd )我已经在这个网站上找到了一个已启动的功能:
function sortArrayByArray(array $toSort, array $sortByValuesAsKeys)
{
$commonKeysInOrder = array_intersect_key(array_flip($sortByValuesAsKeys), $toSort);
$commonKeysWithValue = array_intersect_key($toSort, $commonKeysInOrder);
$sorted = array_merge($commonKeysInOrder, $commonKeysWithValue);
return $sorted;
}
不过……
$sortArray = sortArrayByArray($Array2, $Array1);
print_r($sortArray);
$sortArray 只返回两个结果:
Array
(
[Sean Kingston - Fire Burning] => cccccc
[Kelly Clarkson - Gone] => eeeeee
)
【问题讨论】:
-
这是因为该函数专门匹配值,并且没有考虑不同的情况,例如“3OH!3”与“3oh!3”。这真的是一个正则表达式问题,你还有一首没有破折号和一个额外单词的绿日歌曲......在 php 中没有 4 行函数
-
一种可能的方法:(1) 从所有字符串中去除所有非字母数字字符 (2) 转换为小写 (3) 找到最长的公共子字符串,并拒绝 LCS 小于 50% 的任何内容正在考虑的最短字符串。这可能适用于您的示例,但不适用于更混乱的数据。
-
@Keoki Zee 这是链接:stackoverflow.com/questions/348410/…@Trey 我无法控制从 $Array2 中的外部源查找的歌曲标题,但是它们是在外部源上格式化的。
-
@Frank Farmer 你对这样的事情有什么看法?点击链接,php.net/manual/en/function.similar-text.php#62715