一 题目
有一个用户登录日志 可以使文件也可以使数据库 日志中有 用户名,登录IP地址,登录时间
例如 $data=[
['name'=>'zhangsan','ip'=>'211.64.32.1'],
['name'=>'lisi','ip'=>'212.65.31.1'],
['name'=>'zhangsan','ip'=>'211.64.32.1'],
['name'=>'zhangsan','ip'=>'77.64.32.23'],
['name'=>'zhangsan','ip'=>'58.82.132.7'],
['name'=>'lisi','ip'=>'212.65.31.1'],
];
现统计 每个用户在每个IP地址上的登录次数
例如统计结果
zhangsan 在IP 211.64.32.1 上登录过2次
zhangsan 在IP 77.64.32.23 上登录过1次
lisi 在IP 212.65.31.2 上登录过2次
lisi 在IP 58.82.132.7 上登录过1次
答案
//方法一 循环先走else 这样这个数组的值就等于一 在循环第二次的时候数组的值等于1 在加1 2 先让数组的值等于一 在让数组循环加
$arr=[];
foreach ($data as $key=>$v){
echo $ip=$v['ip'].'<br>';
if(isset($arr[$v['name']][$ip])){
$arr[$v['name']][$ip]=$arr[$v['name']][$ip]+1;
}else{
$arr[$v['name']][$ip]=1;
}
}
//dump($arr);
$a='';
foreach($arr as $key=>$val){
$a.= $key.'在ip';
foreach ($val as $kk=>$value){
$a.= ' '.$kk.'上登录过:'.$value.'次<br>';
}
}
echo $a;
//方法二
$arr=[];
foreach ($data as $key=>$v){
$ip=$v['ip'];
if(isset($arr[$v['name'].'在ip'.$ip])){
$arr[$v['name'].'在ip'.$ip]=$arr[$v['name'].'在ip'.$ip]+1;
}else{
$arr[$v['name'].'在ip'.$ip]=1;
}
}
//dump($arr);
$s='';
foreach ($arr as $kk=>$val){
$s.= $kk .'上登录过'.$val.'<br>';
}
echo $s;
题目二
一共有多少种邮箱类型的邮箱,要求统计前一天注册所有注册用户的邮箱类型并显示在页面上 例如展示成如下样式,邮箱数据可以手动插入数据库作为测试数据,然后再做统计,统计效果如下例;
163.com的邮箱15个
chengdu.com邮箱2个
qq.com的邮箱35个
答案
//方法一
public function look_up(){
//获取前一天的日期根据前一天的日期来查询前一天注册的邮箱有多少
$date=date("Y-m-d",strtotime("-1 day"));
$data= Db::table('user')->where('reg_data','like',"$date%")->select();
//定义一个空数组 把用户的邮箱写入进去
// dump($data);
$arr = [];
foreach ($data as $k=>$v){
//echo'$data[$k]["user_email"]';
// echo $aasa=strrchr($data[$k]["user_email"], '@').'...';
$jq = trim(strrchr($data[$k]["user_email"], '@'),'@');
dump($jq);
if(isset($arr[$jq])){
$arr[$jq]=$arr[$jq]+1;
}else{
$arr[$jq]=1;
}
}
//将数组的键和值都遍出来
function array2string($array){
$string = [];
//检测变量是否是数组 如果是数组执行以下代码
if($array && is_array($array)){
foreach ($array as $key=> $value){
$string[] = $key.'类型的邮箱有'.$value.'个';
}
}
return implode(',',$string);
}
$this->a= array2string($arr);
//方法二
public function yx(){
$sql="select substring_index(user_email,'@',-1) AS domain,count(*) as email_num from user Group By domain";
$data=Db::query($sql);
// dump($data);
$string = '';
foreach ($data as $key=> $value){
$string.= $value["domain"].'类型的邮箱有'.$value["email_num"].'个';
}
// echo $string;
$this->string=$string ;
}
题目三
假设网站运营了多年,网站有评论功能,现在统计每个用户的所有评论标题
假设用户表中有用户名密码,评论表中有评论id,用户id,日期字段(可以是int 或datetime类型),评论标题,评论内容,数据库中没有数据可以手动插入测试数据.要求:显示在页面上效果如下
zhangsan 发表过的评论标题有 (评论id:13) 标题:这个商品很好!,
(评论id:27) 标题:下次还来买HTC的!,
(评论id:89) 标题:这款不如三星的好
答案
public function msg(){
/*
zhangsan 发表过的评论标题有 (评论id:13) 标题:这个商品很好!,
(评论id:27) 标题:下次还来买HTC的!,
(评论id:89) 标题:这款不如三星的好
*/
$data=Db::table('user')->select();
$arr=[];
foreach ($data as $v){
$user_id=$v['user_id'];
$data1=Db::table('comment')->where('user_id',$user_id)->select();
$arr2=[];
foreach($data1 as $vo){
$arr2[$vo["comment_id"]]= $vo["comment_con"];
}
$arr[$v["user_name"]]= $arr2;
}
$s='';
foreach ($arr as $k=>$val){
$s.=$k.'发表过的评论标题有';
foreach($val as $key=>$vv){
$s.='(评论id:'.$key .')标题:'.$vv;
}
$s.='<br>';
}
echo $s;
}
//方法二
public function msgg(){
$data=Db::table('user')->join('comment','user.user_id = comment.user_id')->select();
// dump($data);
$arr=[];
foreach ($data as $v){
// $arr[$v['user_name']][$v['comment_id']]=['comment_id'=>$v['comment_id'],'comment_con'=>$v['comment_con']];
$arr[$v['user_name']][$v['comment_id']]=$v['comment_con'];
}
// dump($arr);
//遍历展示
$a='';
foreach($arr as $k=>$val){
$a.= $k.'发表过的评论有:';
foreach($val as $key=>$value){
$a.= '(评论id:'.$key.')标题:'.$value.'<br>';
}
}
echo $a;