【发布时间】:2011-03-05 08:36:36
【问题描述】:
例如,我有两组这样的数组。
$Arr1['uid'][]='user 1'; $Arr1['weight'][]=1;
$Arr1['uid'][]='user 2'; $Arr1['weight'][]=10;
$Arr1['uid'][]='user 3'; $Arr1['weight'][]=5;
$Arr2['uid'][]='user 1'; $Arr2['weight'][]=3;
$Arr2['uid'][]='user 4'; $Arr2['weight'][]=20;
$Arr2['uid'][]='user 5'; $Arr2['weight'][]=15;
$Arr2['uid'][]='user 2'; $Arr2['weight'][]=2;
当然,两个数组的大小可以不同。 $Arr1 的系数为 0.7,$Arr2 的系数为 0.3。我需要计算以下公式
$result=$Arr1['weight'][$index]*$Arr1Coeff+$Arr2['weight'][$index]*$Arr2Coeff;
在哪里$Arr1['uid']=$Arr2['uid']。因此,当$Arr1['uid'] 不存在于$Arr2 中时,我们需要省略$Arr2,反之亦然。
而且,这是我现在正在使用的算法。
foreach($Arr1['uid'] as $index=>$arr1_uid){
$pos=array_search($arr1_uid, $Arr2['uid']);
if ($pos===false){
$result=$Arr1['weight'][$index]*$Arr1Coeff;
echo "<br>$arr1_uid has not found and RES=".$result;
}else{
$result=$Arr1['weight'][$index]*$Arr1Coeff+$Arr2['weight'][$pos]*$Arr2Coeff;
echo "<br>$arr1_uid has found on $pos and RES=".$result;
}
}
foreach($Arr2['uid'] as $index=>$arr2_uid){
if (!in_array($arr2_uid, $Arr1['uid'])){
$result=$Arr2['weight'][$index]*$Arr2Coeff;
echo "<br>$arr2_uid has not found and RES=".$result;
}else{
echo "<br>$arr2_uid has found somewhere";
}
}
问题是如何优化这个算法?你能为这个问题提供其他更好的解决方案吗?
谢谢。
【问题讨论】:
-
这可以在 SQL 级别完成吗?在我看来,这将是最理想的解决方案。
-
我目前的数据库设计恐怕是不可能的。
-
键的顺序似乎不直观 -
$Arr1['uid'][0]与$Arr1['weight'][0]相关。这种做法很容易变得难以维护(确保您始终为每个 uid 添加权重)。使用$Arr1[] = array('uid'=>'user1', 'weight'=>1)存储数据可能更有意义,甚至,如果uid是数组的唯一键——$Arr1['user1'] = array('uid'=>'user1', 'weight' => 1);(我假设还有更多的数据列而不仅仅是“权重”) ') -
@gnarf。你是完全正确的。我想以这种方式呈现数组,但忘记更改它。谢谢。
标签: php algorithm arrays optimization