ホームページ  >  記事  >  バックエンド開発  >  PHPの多次元配列の問題はちょっと難しい!

PHPの多次元配列の問題はちょっと難しい!

WBOY
WBOYオリジナル
2016-06-23 14:00:33978ブラウズ

次のような 2 つの配列:

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


次の配列を取得するにはどうすればよいですか:


助けてください!


ディスカッションへの返信(解決策)

本当に難しいです。 。 。

純粋なグループを使用することも不可能ではありません

ただし、コードが特殊すぎて、一度使用すると使いにくくなる可能性があります

このようなものはデータベースに保存して、後は好みに合わせて練るのが推奨されます。

それはあなたの配列とニーズに依存します

純粋なグループでそれを行うことは不可能ではありません

しかし、コードはあまりにもターゲットが絞られているため、一度使用した後は使いにくい可能性があります

これを保存することをお勧めします。これはデータベースから読み取られるものです

実際には、翌日の保持数を計算しているだけです。たとえば、3 月 7 日に 4 人が登録し、3 月 8 日にログインした人数をクエリできます。

2014-03-09 の 3 日目のログイン者数が 0 人なのはなぜ 11 番ではないでしょうか?その日のログイン者数は 7 人でした

2014-03-09 3 日目のログイン者数はなぜ 11 人ではないでしょうか? 3月9日は登録者がゼロだったため、その日は7人がログインしました。ということで、N日目の3月9日のログイン者数は全員0人でした


3日目の2014-03-09のログイン者数はなぜ11日ではないのでしょうか? 3月9日は登録者がゼロだったため、その日は7人がログインしました。ということで、N日目の3月9日、ログイン者数は全員0人でした
そして、このロジックで、私は混乱していると言いました



2014-03-09 なぜ3日目にログイン者数が増えたのでしょうか? 0番じゃないの? 3月9日は登録者がゼロだったため、その日は7人がログインしました。ということで、3月9日のN日目はログイン者数が全員0人でした
混乱していると言いましたが、3月9日の登録者数は全員0人でした。空なので、ログイン ログ テーブルはどうやっても翌日の 3 月 9 日の残りの数を見つけることができません。

その日に登録されたアカウントと、次の n 日目にログインしているアカウントをクエリします (n は自然数です)
達成される最終結果は次のとおりです:


投稿もしないでください。多くの!私を助けてくれる専門家はいますか? ! !

難しくはありませんが、複雑で時間がかかります... 今日も残業しなければなりません... 時間がありません

値を取得するには複数回ループできます

まず宣言します結果の空の配列

次に、最初の配列をループし、日付を
に保存します
1 番目と 2 番目の配列をリサイクルし、必要なデータを順番に加算して結果の配列に入れます

難しくはありませんが、複雑です。時間がかかる... 今日も残業しなければならない... 時間がない ああ

値を取得するには複数回ループできます

最初に結果の空の配列を宣言します

次にループします最初の配列、日付を
に保存します
次に、最初と 2 番目の配列をループし、必要なデータを順番に判断し、それを結果の配列に入れます。このループを自分で書こうとしましたが、残念ながらできませんでした。書いてください!

掛け算の式に似ていませんか? この表を見てください

このように

//注册信息$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        ))
と書くことができます
残念ながら、あなたのデータに基づくと、あなたの例の結果は得られません
間違いを犯したようです

掛け算の公式に似ていませんか? この表を見てください (笑) 、ちょっと似ていますね。
私の関数は次のようなものです。start は 2014-1-1 などの開始日、end は 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));
In:
$day は配列によって提供される日付文字列です
strtotime($day) は日付文字列を UNIX タイムスタンプに変換します
date('z '、strtotime($day)) 一連のデータを変更すると日付が変更されるのはなぜですか? [day_0] => [1] => ] =>何が起こっているのですか?

登録情報($array1)とログイン情報($array2)が同じ時刻(day)の場合、day_0が表示されます

登録情報($array1)とログイン情報($array2)が同じ時刻( day) の場合、day_0 の表示を回避するにはどうすればよいですか?どこに判断を追加できますか?

何を避けるべきですか?登録して即日ログインするのが普通ではないでしょうか?

何を避けるべきですか?登録して即日ログインするのが普通ではないでしょうか?

何を避けるべきですか?登録して即日ログインするのが普通ではないでしょうか? ただし、N 日目のログイン回数を数えたいだけです。

何を避けるべきですか?登録して即日ログインするのが普通ではないでしょうか?

何を避けるべきですか?登録して即日ログインするのが普通ではないでしょうか? ただし、N 日目のログイン回数を数えたいだけです。 ああ、分かりました、取らなくても取れます。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。