0

0

PHP 多维数组问题,有点难度!

php中文网

php中文网

发布时间:2016-06-23 14:00:33

|

1111人浏览过

|

来源于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'))));


如何能得到以下数组:


各位帮帮忙!

LHT蓝海豚团购导航
LHT蓝海豚团购导航

Lht蓝海豚(大维)团购导航系统是一套开源程序,采用PHP+MySql平台开发,具有强大的多规则API采集功能、精确化引导消费功能,卓越的负载能力和访问速度,全面支持第三方整合(微博、短信等)前台功能团购名站:显示分类下的所有团购网站,点击团购站,可直接进行查看、推荐、收藏精品商城:为网民推荐展示非团购网站的网上商城今日团购:显示各团购网站正在进行的团购团购排行:今日团购商品可按价格、行业、折扣、

下载

回复讨论(解决方案)

确实很难。。。

用纯属组不是不能做

但是代码太有针对性  用过一次以后未必好用

建议这种东西存入数据库  然后就任意揉捏了.

看你的数组和需求不是很明朗

用纯属组不是不能做

但是代码太有针对性  用过一次以后未必好用

建议这种东西存入数据库  然后就任意揉捏了. 这就是从数据库读出来的

看你的数组和需求不是很明朗 实际上就是计算一个次日留存数。比如 3月7日注册了4个人,查询3月8日有哪几个人登录过。

2014-03-09第3天登录人数为啥是0 不应该是11号吗?那天有7个人登录啊

2014-03-09第3天登录人数为啥是0 不应该是11号吗?那天有7个人登录啊 因为3月9号注册人数为零。所以在3月9号的第N天登录人数都是0


2014-03-09第3天登录人数为啥是0 不应该是11号吗?那天有7个人登录啊 因为3月9号注册人数为零。所以在3月9号的第N天登录人数都是0
还有这逻辑 我表示我凌乱了 



2014-03-09第3天登录人数为啥是0 不应该是11号吗?那天有7个人登录啊 因为3月9号注册人数为零。所以在3月9号的第N天登录人数都是0
还有这逻辑 我表示我凌乱了  3月9号注册人数为零,所以这一天的uid都为空,所以在登录日志表里是无论如何也找不到3月9号的次日留存数的。

查询当日注册的账号,在之后的第n(n是自然数)日当日,也登录的账号;
最终要实现的结果如下图:


不要沉贴啊!有哪位高手能帮帮忙啊!!!

   不难 就是复杂  花时间...  今天又要加班.... 没时间弄啊

你可以多次循环来取值

先声明一个结果空数组

然后循环第一个数组,把日期保存进入

再循环第一个 第二个数组  依次判断想要的数据  加起来以后放进结果数组

   不难 就是复杂  花时间...  今天又要加班.... 没时间弄啊

你可以多次循环来取值

先声明一个结果空数组

然后循环第一个数组,把日期保存进入

再循环第一个 第二个数组  依次判断想要的数据  加起来以后放进结果数组 哎,我自己试过写这个循环呢,可惜啊,写不出来!

不是类似乘法口诀嘛 看那图表

可以这样写

//注册信息$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        ))

遗憾的是根据你的数据,不能得到你示例的结果
应该是你弄错了

不是类似乘法口诀嘛 看那图表 哈哈,是有点像。
我这个功能是这样的,那个起始是起始日期,比如2014-1-1,结束是结束日期,比如2014-1-6,查询出来2014-1-1至2014-1-6的留存数目,看第一行,1-1新增100人,+1就表示1-2登录有多少人,+2就表示1-3登录有多少人。哎,这功能是运营提出来的,着实让我头疼啊这是!!!

可以这样写

//注册信息$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语句好一点。。你查完了再修改数组有点舍近求远

既然是从数据库读出来的。。我觉得还是改进下sql语句好一点。。你查完了再修改数组有点舍近求远 这个是从mongodb数据集里读出来的!要是mysql还好呢!我就不用这么费劲了!

我来观摩下看看 大家是怎么分析此类问题的

涨姿势啦!都是大神

大神们!还有没有别的招儿了?我现在已经焦头烂额了在这!

 看了半天有点晕,    不知道你这数组里的内容是随便写的还是真实数据,如果是真实数据 我怎么算都算不出来你这个数儿呢, 除了 第二天的对.   
如果你的登录人数就是登录人数的话, 第三天的怎么会是1 ?
你这个登录人数 = 登录日志里的人数,   还是说 登录人数 =  登录日志人数 +  注册人数.   先把问题表述清楚了.  

 看了半天有点晕,    不知道你这数组里的内容是随便写的还是真实数据,如果是真实数据 我怎么算都算不出来你这个数儿呢, 除了 第二天的对.   
如果你的登录人数就是登录人数的话, 第三天的怎么会是1 ?
你这个登录人数 = 登录日志里的人数,   还是说 登录人数 =  登录日志人数 +  注册人数.   先把问题表述清楚了.  
3月7日里注册的UID有:0000001,0000002,0000003,0000004
3月8日登录的UID有:0000001,0000002,0000003
3月9日登录的UID有:0000002,0000006,0000007
所以针对3月7日,他的第二天也就是3月9日登录的UID只有一个0000002
以下都依次类推。。。


 看了半天有点晕,    不知道你这数组里的内容是随便写的还是真实数据,如果是真实数据 我怎么算都算不出来你这个数儿呢, 除了 第二天的对.   
如果你的登录人数就是登录人数的话, 第三天的怎么会是1 ?
你这个登录人数 = 登录日志里的人数,   还是说 登录人数 =  登录日志人数 +  注册人数.   先把问题表述清楚了.  
3月7日里注册的UID有:0000001,0000002,0000003,0000004
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 个!

照你这么说那也不对啊3月8日第4天的登录人数为啥为1 不应该是2吗?

照你这么说那也不对啊3月8日第4天的登录人数为啥为1 不应该是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_2] => Array                (                    [0] => 0000002                )         )


第二天 3 个
第三天 1 个
第五天 3 个
而绝没有第四天的2 个! 嗯,我这块写错了。

正确的算法,不会得到错误的结果
基本算法我 #15 已经给了,你的工作只是优化一下

正确的算法,不会得到错误的结果
基本算法我 #15 已经给了,你的工作只是优化一下 我在想,把你那个数组,再处理一下变成我要的数组。

$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)]++;
不就是计数了吗?

这有什么可想的?
$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)) 取得日期是在一年中的第几天

哎!跟我想要的最终结果还是有些不一样啊!

$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

注册信息($array1)和登录信息($array2)时间(day)相同时,就会出现 day_0 怎样避免呢?在哪能加个判断?

要避免干什么?当天注册,当天登录,不是很正常吗?

要避免干什么?当天注册,当天登录,不是很正常吗?

要避免干什么?当天注册,当天登录,不是很正常吗? 可我就想计算他第N天登录的啊!


要避免干什么?当天注册,当天登录,不是很正常吗?

要避免干什么?当天注册,当天登录,不是很正常吗? 可我就想计算他第N天登录的啊! 哦了,知道了,我不取就得了。

相关文章

PHP速学教程(入门到精通)
PHP速学教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
C++ 设计模式与软件架构
C++ 设计模式与软件架构

本专题深入讲解 C++ 中的常见设计模式与架构优化,包括单例模式、工厂模式、观察者模式、策略模式、命令模式等,结合实际案例展示如何在 C++ 项目中应用这些模式提升代码可维护性与扩展性。通过案例分析,帮助开发者掌握 如何运用设计模式构建高质量的软件架构,提升系统的灵活性与可扩展性。

8

2026.01.30

c++ 字符串格式化
c++ 字符串格式化

本专题整合了c++字符串格式化用法、输出技巧、实践等等内容,阅读专题下面的文章了解更多详细内容。

9

2026.01.30

java 字符串格式化
java 字符串格式化

本专题整合了java如何进行字符串格式化相关教程、使用解析、方法详解等等内容。阅读专题下面的文章了解更多详细教程。

8

2026.01.30

python 字符串格式化
python 字符串格式化

本专题整合了python字符串格式化教程、实践、方法、进阶等等相关内容,阅读专题下面的文章了解更多详细操作。

1

2026.01.30

java入门学习合集
java入门学习合集

本专题整合了java入门学习指南、初学者项目实战、入门到精通等等内容,阅读专题下面的文章了解更多详细学习方法。

20

2026.01.29

java配置环境变量教程合集
java配置环境变量教程合集

本专题整合了java配置环境变量设置、步骤、安装jdk、避免冲突等等相关内容,阅读专题下面的文章了解更多详细操作。

17

2026.01.29

java成品学习网站推荐大全
java成品学习网站推荐大全

本专题整合了java成品网站、在线成品网站源码、源码入口等等相关内容,阅读专题下面的文章了解更多详细推荐内容。

19

2026.01.29

Java字符串处理使用教程合集
Java字符串处理使用教程合集

本专题整合了Java字符串截取、处理、使用、实战等等教程内容,阅读专题下面的文章了解详细操作教程。

3

2026.01.29

Java空对象相关教程合集
Java空对象相关教程合集

本专题整合了Java空对象相关教程,阅读专题下面的文章了解更多详细内容。

6

2026.01.29

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
微信小程序开发之API篇
微信小程序开发之API篇

共15课时 | 1.2万人学习

php-src源码分析探索
php-src源码分析探索

共6课时 | 0.5万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号