PHP 多维数组问题,有点难度! php数组多维留存 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 还有这逻辑 我表示我凌乱了 3月9号注册人数为零,所以这一天的uid都为空,所以在登录日志表里是无论如何也找不到3月9号的次日留存数的。 可以这样写//注册信息$array1 = array(0=>array('day'=>'2014-3-7',//注册日期'data'=>array(0=>array('uid'=>'0000001'),1=>array('uid'=>'0000002'),3=>array('uid'=>'0000003'),4=>array('uid'=>'0000004'),)),1=>array('day'=>'2014-3-8',//注册日期'data'=>array(0=>array('uid'=>'0000005'),1=>array('uid'=>'0000007'),2=>array('uid'=>'0000006'),)),2=>array('day'=>'2014-3-10',//注册日期'data'=>array(0=>array('uid'=>'0000008'),1=>array('uid'=>'0000010'),2=>array('uid'=>'0000009'),3=>array('uid'=>'0000012'),4=>array('uid'=>'0000013'),)),3=>array('day'=>'2014-3-11',//注册日期'data'=>array(0=>array('uid'=>'0000015'),1=>array('uid'=>'0000014'),2=>array('uid'=>'0000025'),3=>array('uid'=>'0000017'),4=>array('uid'=>'0000018'),)),); //登录日志$array2 = array(0=>array('day'=>'2014-3-8',//登录日期'ge_data'=>array(0=>array('uid'=>'0000001'),1=>array('uid'=>'0000002'),3=>array('uid'=>'0000003'))),1=>array('day'=>'2014-3-9',//登录日期'ge_data'=>array(0=>array('uid'=>'0000002'),1=>array('uid'=>'0000007'),2=>array('uid'=>'0000006'),)),2=>array('day'=>'2014-3-11',//登录日期'ge_data'=>array(0=>array('uid'=>'0000001'),1=>array('uid'=>'0000007'),2=>array('uid'=>'0000008'),3=>array('uid'=>'0000012'),4=>array('uid'=>'0000013'),5=>array('uid'=>'0000003'),6=>array('uid'=>'0000002'))));$res = array();//读取每天的注册记录foreach($array1 as $r) { $day = $r['day']; $res[$day] = array('day' => $day, 'count' => count($r['data'])); $d = date('z', strtotime($day)); //对于当日注册每个用户 foreach($r['data'] as $us) { foreach($array2 as $t) { $rd = date('z', strtotime($t['day'])); //检查他在哪天登录了 foreach($t['ge_data'] as $u) { if($us['uid'] == $u['uid']) $res[$day]['day_'.($rd-$d)][] = $us['uid']; //保存登录的uid以便于检查 } } }}print_r($res);Array( [2014-3-7] => Array ( [day] => 2014-3-7 [count] => 4 [day_1] => Array ( [0] => 0000001 [1] => 0000002 [2] => 0000003 ) [day_4] => Array ( [0] => 0000001 [1] => 0000002 [2] => 0000003 ) [day_2] => Array ( [0] => 0000002 ) ) [2014-3-8] => Array ( [day] => 2014-3-8 [count] => 3 [day_1] => Array ( [0] => 0000007 [1] => 0000006 ) [day_3] => Array ( [0] => 0000007 ) ) [2014-3-10] => Array ( [day] => 2014-3-10 [count] => 5 [day_1] => Array ( [0] => 0000008 [1] => 0000012 [2] => 0000013 ) ) [2014-3-11] => Array ( [day] => 2014-3-11 [count] => 5 ))遗憾的是根据你的数据,不能得到你示例的结果应该是你弄错了 既然是从数据库读出来的。。我觉得还是改进下sql语句好一点。。你查完了再修改数组有点舍近求远 这个是从mongodb数据集里读出来的!要是mysql还好呢!我就不用这么费劲了! 3月7日里注册的UID有:0000001,0000002,0000003,00000043月8日登录的UID有:0000001,0000002,00000033月9日登录的UID有:0000002,0000006,0000007所以针对3月7日,他的第二天也就是3月9日登录的UID只有一个0000002以下都依次类推 3月7日里注册的UID有:0000001,0000002,0000003,00000043月8日登录的UID有:0000001,0000002,00000033月9日登录的UID有:0000002,0000006,0000007所以针对3月7日,他的第二天也就是3月9日登录的UID只有一个0000002以下都依次类推写错了,是第三天也就是3月9日 所以应该是 [2014-3-7] => Array ( [day] => 2014-3-7 [count] => 4 [day_1] => Array ( [0] => 0000001 [1] => 0000002 [2] => 0000003 ) [day_4] => Array ( [0] => 0000001 [1] => 0000002 [2] => 0000003 ) [day_2] => Array ( [0] => 0000002 ) )即第二天 3 个第三天 1 个第五天 3 个而绝没有第四天的2 个! 我在想,把你那个数组,再处理一下变成我要的数组。$array = array( '2014-3-7' => array( 'day' => '2014-3-7', 'count' => 4, 'day_1' => array( 0 => 0000001, 1 => 0000002, 2 => 0000003 ) , 'day_4' => array( 0 => 0000001, 1 => 0000002, 2 => 0000003 ) , 'day_3' => array( 0 => 0000001, 1 => 0000002 ) , 'day_2' => array( 0 => 0000002 ) , 'day_5' => array( 0 => 0000002 ) ) , '2014-3-8' => array( 'day' => '2014-3-8', 'count' => 3, 'day_4' => array( 0 => 0000005, 1 => 0000007 ) , 'day_2' => array( 0 => 0000005, 1 => 0000007, 2 => 0000006 ) , 'day_1' => array( 0 => 0000007, 1 => 0000006 ) , 'day_3' => array( 0 => 0000007, 1 => 0000006 ) ) , '2014-3-10' => array( 'day' => '2014-3-10', 'count' => 5, 'day_1' => array( 0 => 0000008, 1 => 0000012, 2 => 0000013 ) , 'day_2' => array( 0 => 0000008, 1 => 0000010, 2 => 0000012, 3 => 0000013 ) ) , '2014-3-11' => array( 'day' => '2014-3-11', 'count' => 5, 'day_1' => array( 0 => 0000015, 1 => 0000025, 2 => 0000018 ) )); 这有什么可想的?$res[$day]['day_'.($rd-$d)][] = $us['uid'];改成$res[$day]['day_'.($rd-$d)]++;不就是计数了吗? $d = date('z', strtotime($day));这个是什么意思? $d = date('z', strtotime($day));中:$day 是数组提供的 日期串strtotime($day) 将日期串转换为unix时间戳date('z', strtotime($day)) 取得日期是在一年中的第几天 为什么我换一组数据,会出现:[day_0] => Array ( [0] => 3001000 [1] => 3001726 [2] => 3001728 [3] => 3001733 [4] => 3001734 [5] => 3001735 [6] => 3001745 )这个是怎么回事? 注册信息($array1)和登录信息($array2)时间(day)相同时,就会出现 day_0 PHP数组比较 求解 html借助php防cc攻击 html无法嵌套php代码来输出session值?? 成都的php程序员薪水几何?很久没来了,散点分! 生日报警器怎么弄呢? 请教如下的错误提示。 在Apache2.043(Win2K Server)上怎么也装不上PHP4.2.3,救救我吧! 有没有精简的判断客户是否已经注册的语句? mysql中缺少mysql.func表? 求助:关于网站同步内容问题 如何创建关联的mysql表-平时看的都是单表操作的书视频什么的 新手请教PHP怎么批量循环打印出四位数的数字?
$array1 = array(
0=>array(
'day'=>'2014-3-7',//注册日期
'data'=>array(
0=>array('uid'=>'0000001'),
1=>array('uid'=>'0000002'),
3=>array('uid'=>'0000003'),
4=>array('uid'=>'0000004'),
)
),
1=>array(
'day'=>'2014-3-8',//注册日期
'data'=>array(
0=>array('uid'=>'0000005'),
1=>array('uid'=>'0000007'),
2=>array('uid'=>'0000006'),
)
),
2=>array(
'day'=>'2014-3-10',//注册日期
'data'=>array(
0=>array('uid'=>'0000008'),
1=>array('uid'=>'0000010'),
2=>array('uid'=>'0000009'),
3=>array('uid'=>'0000012'),
4=>array('uid'=>'0000013'),
)
),
3=>array(
'day'=>'2014-3-11',//注册日期
'data'=>array(
0=>array('uid'=>'0000015'),
1=>array('uid'=>'0000014'),
2=>array('uid'=>'0000025'),
3=>array('uid'=>'0000017'),
4=>array('uid'=>'0000018'),
)
),
);
//登录日志
$array2 = array(
0=>array(
'day'=>'2014-3-8',//登录日期
'ge_data'=>array(
0=>array('uid'=>'0000001'),
1=>array('uid'=>'0000002'),
3=>array('uid'=>'0000003')
)
),
1=>array(
'day'=>'2014-3-9',//登录日期
'ge_data'=>array(
0=>array('uid'=>'0000002'),
1=>array('uid'=>'0000007'),
2=>array('uid'=>'0000006'),
)
),
2=>array(
'day'=>'2014-3-11',//登录日期
'ge_data'=>array(
0=>array('uid'=>'0000001'),
1=>array('uid'=>'0000007'),
2=>array('uid'=>'0000008'),
3=>array('uid'=>'0000012'),
4=>array('uid'=>'0000013'),
5=>array('uid'=>'0000003'),
6=>array('uid'=>'0000002')
)
)
);$res = array();//读取每天的注册记录
foreach($array1 as $r) {
$day = $r['day'];
$res[$day] = array('day' => $day, 'count' => count($r['data']));
$d = date('z', strtotime($day)); //对于当日注册每个用户
foreach($r['data'] as $us) {
foreach($array2 as $t) {
$rd = date('z', strtotime($t['day']));
//检查他在哪天登录了
foreach($t['ge_data'] as $u) {
if($us['uid'] == $u['uid']) $res[$day]['day_'.($rd-$d)][] = $us['uid']; //保存登录的uid以便于检查
}
}
}
}
print_r($res);Array
(
[2014-3-7] => Array
(
[day] => 2014-3-7
[count] => 4
[day_1] => Array
(
[0] => 0000001
[1] => 0000002
[2] => 0000003
) [day_4] => Array
(
[0] => 0000001
[1] => 0000002
[2] => 0000003
) [day_2] => Array
(
[0] => 0000002
) ) [2014-3-8] => Array
(
[day] => 2014-3-8
[count] => 3
[day_1] => Array
(
[0] => 0000007
[1] => 0000006
) [day_3] => Array
(
[0] => 0000007
) ) [2014-3-10] => Array
(
[day] => 2014-3-10
[count] => 5
[day_1] => Array
(
[0] => 0000008
[1] => 0000012
[2] => 0000013
) ) [2014-3-11] => Array
(
[day] => 2014-3-11
[count] => 5
))遗憾的是根据你的数据,不能得到你示例的结果
应该是你弄错了
3月8日登录的UID有:0000001,0000002,0000003
3月9日登录的UID有:0000002,0000006,0000007
所以针对3月7日,他的第二天也就是3月9日登录的UID只有一个0000002
以下都依次类推
3月8日登录的UID有:0000001,0000002,0000003
3月9日登录的UID有:0000002,0000006,0000007
所以针对3月7日,他的第二天也就是3月9日登录的UID只有一个0000002
以下都依次类推写错了,是第三天也就是3月9日
[2014-3-7] => Array
(
[day] => 2014-3-7
[count] => 4
[day_1] => Array
(
[0] => 0000001
[1] => 0000002
[2] => 0000003
)
[day_4] => Array
(
[0] => 0000001
[1] => 0000002
[2] => 0000003
)
[day_2] => Array
(
[0] => 0000002
)
)即
第二天 3 个
第三天 1 个
第五天 3 个
而绝没有第四天的2 个!
'2014-3-7' => array(
'day' => '2014-3-7',
'count' => 4,
'day_1' => array(
0 => 0000001,
1 => 0000002,
2 => 0000003
) ,
'day_4' => array(
0 => 0000001,
1 => 0000002,
2 => 0000003
) ,
'day_3' => array(
0 => 0000001,
1 => 0000002
) ,
'day_2' => array(
0 => 0000002
) ,
'day_5' => array(
0 => 0000002
)
) ,
'2014-3-8' => array(
'day' => '2014-3-8',
'count' => 3,
'day_4' => array(
0 => 0000005,
1 => 0000007
) ,
'day_2' => array(
0 => 0000005,
1 => 0000007,
2 => 0000006
) ,
'day_1' => array(
0 => 0000007,
1 => 0000006
) ,
'day_3' => array(
0 => 0000007,
1 => 0000006
)
) ,
'2014-3-10' => array(
'day' => '2014-3-10',
'count' => 5,
'day_1' => array(
0 => 0000008,
1 => 0000012,
2 => 0000013
) ,
'day_2' => array(
0 => 0000008,
1 => 0000010,
2 => 0000012,
3 => 0000013
)
) ,
'2014-3-11' => array(
'day' => '2014-3-11',
'count' => 5,
'day_1' => array(
0 => 0000015,
1 => 0000025,
2 => 0000018
)
)
);
$res[$day]['day_'.($rd-$d)][] = $us['uid'];
改成
$res[$day]['day_'.($rd-$d)]++;
不就是计数了吗?
中:
$day 是数组提供的 日期串
strtotime($day) 将日期串转换为unix时间戳
date('z', strtotime($day)) 取得日期是在一年中的第几天
(
[0] => 3001000
[1] => 3001726
[2] => 3001728
[3] => 3001733
[4] => 3001734
[5] => 3001735
[6] => 3001745
)这个是怎么回事?