我有一个问题,我很不确定如何解决这个问题。
给出的是这种格式的数组:
$array01 = array(
0 => array("hallo", "welt", "du", "ich"),
1 => array("mag", "dich"),
2 => array("nicht", "haha", "huhu")
);
$array02 = array(
0 => array("haha", "welt", "dich"),
1 => array("hallo", "mag", "nicht"),
2 => array("du", "ich", "huhu")
);
现在我想计算这些数组的某种相似值。这些数组是根据其含义聚类术语的结果。
我想知道的是这些术语与两个不同的用户($array01 = user1, $array02 = user2)
有多么相似。 0,1,2是那些簇(它们不必是相同的长度)
编辑: 所以我试着进一步描述一下: 每个数组都是用户根据其含义聚类术语(hallo,welt,du,ich ......)的结果。因此,每个子阵列都是由用户定义的一个集群。现在问题是用户不限制他放置术语或整个集群的位置,因此我不能只将$ array01 [0]与$ array02 [0]进行比较。 我想我需要将子阵列与大多数术语进行比较。每个用户都可以对所有术语进行聚类。
例如:
$ array01 [0]和$ array02 [2]。他们有两个共同的术语:“du”和“ich” - > 1
其他术语没有明确的聚类,所以我猜这个例子会产生1,因为聚类不是很相似。
答案 0 :(得分:2)
这个怎么样?
代码:
<?php
$array01 = array(
0 => array("hallo", "welt", "du", "ich"),
1 => array("mag", "dich"),
2 => array("nicht", "haha", "huhu")
);
$array02 = array(
0 => array("haha", "welt", "dich"),
1 => array("hallo", "mag", "nicht"),
2 => array("du", "ich", "huhu")
);
function get_similar_items() {
$arrs = func_get_args();
foreach ($arrs as &$arr) {
while (list($k, $v) = each($arr)) {
if (is_array($v)) {
array_splice($arr,$k,1,$v);
next($arr);
}
}
}
return call_user_func_array('array_intersect',$arrs);
}
print_r(get_similar_items($array01,$array02));
结果:
Array
(
[0] => hallo
[1] => welt
[2] => du
[3] => ich
[4] => mag
[5] => dich
[6] => nicht
[7] => haha
[8] => huhu
)
代码:
<?php
$array01 = array(
0 => array("hallo", "welt", "du", "ich"),
1 => array("mag", "dich"),
2 => array("nicht", "haha", "huhu")
);
$array02 = array(
0 => array("haha", "welt", "dich"),
1 => array("hallo", "mag", "nicht"),
2 => array("du", "ich", "huhu")
);
$array03 = array(
0 => array("haha", "haha", "dich"),
1 => array("dich", "mag", "mag"),
2 => array("du", "ich", "haha")
);
function get_similar_items_count() {
$arrs = func_get_args();
foreach ($arrs as &$arr) {
while (list($k, $v) = each($arr)) {
if (is_array($v)) {
array_splice($arr,$k,1,$v);
next($arr);
}
}
}
unset($arr);
$counts = array();
foreach ($arrs as $arr) {
foreach (array_count_values($arr) as $k => $v) {
if ($v) {
if (!isset($counts[$k])) {
$counts[$k] = $v;
} else {
$counts[$k] += $v;
}
}
}
}
return $counts;
}
print_r(get_similar_items_count($array01,$array02,$array03));
结果:
Array
(
[hallo] => 2
[welt] => 2
[du] => 3
[ich] => 3
[mag] => 4
[dich] => 4
[nicht] => 2
[haha] => 5
[huhu] => 2
)
答案 1 :(得分:1)
count(array_intersect($array01[0],$array02[0]));
可能foreach()
通过僵尸阵列&amp;总结它。
答案 2 :(得分:1)
根据您的评论,我的理解是您希望将第一个数组中的所有值与第二个数组进行比较。 IOW array1的所有子数组中的所有单词都应该与array2的所有子数组中的所有单词进行比较
$array01 = array(
0 => array("hallo", "welt", "du", "ich"),
1 => array("mag", "dich"),
2 => array("nicht", "haha", "huhu")
);
$array02 = array(
0 => array("haha", "welt", "dich"),
1 => array("hallo", "mag", "nicht"),
2 => array("du", "ich", "huhu")
);
$t_array01 = array();
foreach($array01 as $arr) {
$t_array01 = array_merge($t_array01,$arr);
}
$t_array02 = array();
foreach($array02 as $arr) {
$t_array02 = array_merge($t_array02,$arr);
}
$common = array_intersect($t_array01,$t_array02);
$common
是两个数组中所有单词的数组。在您的示例中,两个数组都包含所有相同的单词,因此它包含所有单词。如果您只想要计算多少,您可以count($common)