【问题标题】:Autovivification in PHPPHP中的自动激活
【发布时间】:2011-05-17 07:37:53
【问题描述】:

如果我有这个 SQL 查询:

select substring(id for 2) as key, 
yw, count(*)
from pref_money group by yw, key

每周和每个键返回用户数:

 key |   yw    | count
-----+---------+-------
 VK  | 2010-45 |   144
 VK  | 2010-44 |    79
 MR  | 2010-46 |    72
 OK  | 2010-48 |   415
 FB  | 2010-45 |    11
 FB  | 2010-44 |     8
 MR  | 2010-47 |    55
 VK  | 2010-47 |   136
 DE  | 2010-48 |    35
 VK  | 2010-46 |   124
 MR  | 2010-44 |    40
 MR  | 2010-45 |    58
 FB  | 2010-47 |    13
 FB  | 2010-46 |    13
 OK  | 2010-47 |  1834
 MR  | 2010-48 |    13
 OK  | 2010-46 |  1787
 DE  | 2010-44 |    83
 DE  | 2010-45 |   128
 FB  | 2010-48 |     4
 OK  | 2010-44 |  1099
 OK  | 2010-45 |  1684
 DE  | 2010-46 |   118
 VK  | 2010-48 |    29
 DE  | 2010-47 |   148

那我该如何计算这些用户呢?我正在尝试:

    $sth = $db->prepare('select substring(id for 2) as key, yw, count(*)
                         from pref_money group by yw, key');
    $sth->execute();
    while ($row = $sth->fetch(PDO::FETCH_ASSOC))
            ++$users[$row['yw']][$row['key']];
    print_r($users);

但会出现许多错误。

我正在尝试获取a stacked bars diagram 的数据。 x 轴将显示周数,y 轴将显示用户数,按关键字符串分组。

谢谢!亚历克斯

【问题讨论】:

    标签: php autovivification


    【解决方案1】:

    您是要总计count 列还是仅获取返回的行数?如果是后者,php 有一个方法。如果是前者,则需要改为 $users[$row['yw']][$row['key'] += $row['count'](假设数组已经创建)。

    【讨论】:

    • 关于行数的好点,这在我的代码中是错误的。但是你如何“创建”数组呢?我来自 Perl,那里的数组会自动创建......(所谓的自动生存)
    • 其实用 $users[$row['yw']][$row['key']] = $row['count'];我的代码现在可以正常工作了,所以这些只是警告。谢谢你的回答。我仍然想知道如何消除 ++$arr['a']['b'] 的警告...
    • PHP 需要在使用前声明。 (基本上你试图增加一个空值,因此警告)。为了消除这种情况,您可能会使用$users = Array(),然后检查if (!is_set($users[$row['yw']]) $users[$row['yw']] = Array();,然后再检查if (!is_set($users[$row['yw']][$row['key']])) $users[$row['yw']][$row['key']] = 0;,然后您可以开始任何算术。
    【解决方案2】:
    $sth = $db->prepare('select substring(id for 2) as key, yw, count(*)
                             from pref_money group by yw, key');
        $sth->execute();
        $users=array();  //  register $users as an array.
        while ($row = $sth->fetch(PDO::FETCH_ASSOC))
                if(!isset($users[$row['yw']])){// see if $users['whatever_key'] has already been set
                   $users[$row['yw']]=0;//if not, initialize it as a default starting value of 0
                 }
                $users[$row['yw']]+=$row['key'];//now we won't get any nasty notices here about undeclared variables or keys..
        print_r($users);
    

    【讨论】:

    • 问题不在于未初始化变量的错误,我没有看到他的其余代码,据我所知,他正确注册了它们,问题是他做了“++ $users[$row['yw']][$row['key']];"这并不能完全将这些值相加......当我不知道他们是否正确初始化时,我在其他人编写的代码块中工作时强迫抑制。
    • 请问“正确注册变量”是什么意思?我很乐意在使用它们之前在 PHP 中声明我的变量,否则会出现错误(例如 Perl 中的“use strict”),但我还没有找到如何在 PHP 中执行此操作。
    • 建议错误抑制字符会教坏习惯 - 至少您应该提出问题的原因以及如何解决它。另外,自动激活是指将变量视为动态结构 - 即在使用之前不需要注册键。
    猜你喜欢
    • 2020-11-24
    • 2015-08-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-22
    • 1970-01-01
    相关资源
    最近更新 更多