哪个循环最适合执行以下操作?

时间:2016-02-04 10:08:40

标签: php

我正在尝试根据用户的兴趣播放广告等内容。广告商设置了某些其他参数。如果所有这些参数都与某个用户个人资料相匹配,那么必须向他播放该广告,否则请检查下一个广告。如果广告列表结束且没有匹配,则删除其中一个参数然后匹配。最后,如果没有匹配的参数,则播放位于列表顶部的广告。我有两个用于用户和广告的单独表格,加入它们并获取数据匹配是否合适? 谁能告诉我哪个循环最适合这里?

这是我迄今为止所尝试过的。

`公共功能广告($ ads,$ userid){

    for($i=0;$i<count($ads);$i++){
    $sql="SELECT ua.ads,ua.frm_age,ua.t_age,ua.user_income,ua.user_occupation,ua.user_gender,U.gender,U.income,U.occupation, U.dob FROM  user_ad ua LEFT JOIN users U  ON U.userid =ua.userid where U.userid='$userid' AND ua.ads='$ads[$i]'";
    $res=@mysql_query($sql);
    $numOFRows  =@mysql_num_rows($res);

    if($numOFRows > 0){
        while ($result = @mysql_fetch_assoc($res)){
            $returnArr[]=$result;
            $user_occ=$result['user_occupation'];
            $user_incm=$result['user_income'];
            $gen=$result['user_gender'];
            $f_age=$result['frm_age'];
            $t_age=$result['t_age'];
            //print_r ($returnArr);
            $dob= $result['dob'];
            $birthdate = new DateTime($dob);
            $today   = new DateTime('today');
            $age = $birthdate->diff($today)->y;
            //print_r ($age);

        //return (array($result));
         for($i=0;$i<4;$i++){
            for($j=0;$j<count($ads);$j++){
            if ($ads[$j]!==0){

            if(($user_occ==$result['occupation'])&&($user_incm==$result['income'])&&($gen==$result['gender'] || $gen =='Both')&&(($age>= $f_age) && ($age<= $t_age))){

                $ads[]=$result['ads'];
                }
                return $ads[$j];
            }

            }

             for($k=0;$k<count($ads);$k++){
                 if ($ads[$k]!==0){
             if(($user_occ==$result['occupation'])&&($gen==$result['gender'])&&(($age>= $f_age) && ($age<= $t_age))){

                 $ads[]=$result['ads'];
                 return $ads[$k];
                 }
             }
             }
             for($m=0;$m<count($ads);$m++){
                 if ($ads[$m]!==0){
             if(($gen==$result['gender'])&&(($age>= $f_age) && ($age<= $t_age))){

                 $ads[]=$result['ads'];
                 return $ads[$m];
                 }
             }
             }
             for($n=0;$n<count($ads);$n++){
                 if ($ads[$n]!==0){
             if(($gen==$result['gender'])||($gen=='Both'))
            { 
                 $ads[]=$result['ads'];

                 return $ads[$n];
                 }


                }

            }

        }
        return $ads[0];

    }

 }
 }
 }``

如我所建议的那样,我使用了foreach循环并尝试了这一点。

while ($result = @mysql_fetch_array($res)){

            $dob= $result['dob'];
            $birthdate = new DateTime($dob);
            $today   = new DateTime('today');
            $age = $birthdate->diff($today)->y;
            //print_r ($age);



        foreach($result as $array){

            for($i=0;$i<count($ads);$i++){
            if(($array['user_occupation']==$array['occupation'])&& ($array['user_income']==$array['income']) && ($array['user_gender']==$array['fbgender'] || $array['user_gender']=='Both') && (($age>=$array['frm_age'])&&($age<=$array['t_age']))){

                return $ads[$i];
                break;
            }
            elseif(($array['user_occupation']==$array['occupation']) && ($array['user_gender']==$array['fbgender'] || $array['user_gender']=='Both') && (($age>=$array['frm_age'])&&($age<=$result['t_age']))){
                //return $ads[$i];
                break;
            }
            elseif(($array['user_gender']==$array['fbgender'] || $array['user_gender']=='Both') && (($age>=$array['frm_age'])&&($age<=$array['t_age']))){
                //return $ads[$i];
                break;
            }
            elseif(($array['user_gender']==$array['fbgender'] || $array['user_gender']=='Both')){
                //return $ads[$i];
                break;
            }
            else{
                //return $ads[0];
            }
        }

        }

但是我得到的错误就像未定义的变量$ array和非法偏移&#39; user_occupation&#39;,非法偏移&#39;职业&#39;等等...

2 个答案:

答案 0 :(得分:0)

我会使用一个foreach()循环来切换参数,跟踪哪些广告以及填充了多少要求,循环完成后,获得最佳匹配并将其显示给用户

答案 1 :(得分:0)

您可以预告广告并查看条件。

但是,如果有大量广告,您可以考虑将它们存储为数组(如果尚未存在),或者甚至将它们存储在数据库(如mysql)中,并仅选择所需的特定广告(如果有很多广告需要循环,那么毫无疑问会比foreach更快)。如果mysql返回多个结果,您可以获取结果并使用while循环进行循环。