计算多维数组中的值

时间:2013-11-24 08:54:01

标签: php arrays multidimensional-array

这是一个可能重复的条目。不幸的是我无法从Stackoverflow上的其他条目中弄清楚这一点。如果可以的话,请帮忙:))

我正在使用php中的迷你统计脚本来显示一些基本的统计信息。

我有一个多维数组,如下所示:

$found_data = 
array( 
    array('2011-11-02' => 'mobile'),
    array('2011-11-02' => 'mobile'),
    array('2011-11-04' => 'mobile'),
    array('2011-11-08' => 'Desktop'),
    array('2011-11-08' => 'mobile'),
    array('2011-11-08' => 'mobile'),
    array('2011-11-08' => 'mobile'),
    array('2011-11-15' => 'mobile'),
    array('2011-11-18' => 'mobile'),
    array('2011-11-21' => 'Desktop'),
    array('2011-11-23' => 'mobile'),
    array('2011-11-28' => 'Desktop'),
    array('2011-11-30' => 'mobile')
);

现在我想代表这样的数据:

2011-11-01: 0 from mobile and 0 from desktop
2011-11-02: 2 from mobile and 0 from desktop
...
2011-11-30: 1 from mobile and 0 from desktop

我很确定你有这个想法。

我在很多变化中尝试了以下内容,但没有任何作用:

echo count(array_keys($found_data['2011-11-02'], "mobile"));

非常感谢任何帮助:)

2 个答案:

答案 0 :(得分:2)

您不能将$ found_data编入索引:$found_data['2011-11-02']因为您没有名为“2011-11-02”的密钥。您的$ found_data声明等同于:

$found_data = 
array( 
    0 => array('2011-11-02' => 'mobile'),
    1 => array('2011-11-02' => 'mobile'),
    2 => array('2011-11-04' => 'mobile'),
    ... // and so on
);

我知道您使用multidimension多次使用相同的密钥,但正如上面的结构所示​​,您不能简单地使用array_keys

获得所需内容的一种方法是:

  1. 创建结果变量,初始化为空数组
  2. 获取$ found_data
  3. 中的下一项
  4. 获取商品的keyvalue
  5. 检查结果中是否存在key,如果是,则增加相应的value。否则,创建一个以mobiledesktop为键的新数组,并使用value确定哪一个应该用1初始化(另一个则为0)。使用键key
  6. 将此数组分配给结果

    预期的结果数组结构如下:

    $result = array(
        '2011-11-02' => array(
            'mobile' => 2,
            'desktop' => 1,
        ),
        '2011-11-04' => array(
            'mobile' => 0,
            'desktop' => 1,
        ),
        '2011-11-05' => array(
            'mobile' => 2,
            'desktop' => 0,
        ),
    );
    

答案 1 :(得分:0)

我已经用不同的方式解决了这个问题,而不是上面提到的。

如果有人感兴趣,这就是答案:

$found_data = 
array( 
    array('2011-11-02' => 'Mobile'),
    array('2011-11-02' => 'Mobile'),
    array('2011-11-04' => 'Mobile'),
    array('2011-11-08' => 'Desktop'),
    array('2011-11-08' => 'Mobile'),
    array('2011-11-08' => 'Mobile'),
    array('2011-11-08' => 'Mobile'),
    array('2011-11-15' => 'Mobile'),
    array('2011-11-18' => 'Mobile'),
    array('2011-11-21' => 'Desktop'),
    array('2011-11-23' => 'Mobile'),
    array('2011-11-28' => 'Desktop'),
    array('2011-11-30' => 'Mobile')
);



foreach($found_data as $single_data)
{
    foreach($single_data as $data => $key)
    {   
        $array_combined[$data]['Mobile'] = array();
        $array_combined[$data]['Tablet'] = array();
        $array_combined[$data]['Desktop'] = array();                
    }
}


foreach($found_data as $single_data)
{
    foreach($single_data as $data => $key)
    {
        if($key=='Desktop')
            array_push($array_combined[$data]['Desktop'], $key);
        else if($key=='Tablet')
            array_push($array_combined[$data]['Tablet'], $key);
        else if($key=='Mobile')
            array_push($array_combined[$data]['Mobile'], $key); 

    }
}


$startdate = strtotime('2011-11-01 00:00:01');
$days = 30;

echo 'Total hits the last 30 days: '.count($found_data).'<br />';

echo 'Desktop hits the last 30 days<br />';
for ($i = 0; $i <= $days; $i++) {
    $date = date('Y-m-d', $startdate+$i*60*60*24);
    printf("%s\t%s\n", $date, array_key_exists($date, $array_combined) ? count($array_combined[$date]['Desktop']) : 0);
    echo '<br />';
}

echo 'Tablet hits the last 30 days<br />';
for ($i = 0; $i <= $days; $i++) {
    $date = date('Y-m-d', $startdate+$i*60*60*24);
    printf("%s\t%s\n", $date, array_key_exists($date, $array_combined) ? count($array_combined[$date]['Tablet']) : 0);
    echo '<br />';
}

echo 'Mobile hits the last 30 days<br />';
for ($i = 0; $i <= $days; $i++) {
    $date = date('Y-m-d', $startdate+$i*60*60*24);
    printf("%s\t%s\n", $date, array_key_exists($date, $array_combined) ? count($array_combined[$date]['Mobile']) : 0);
    echo '<br />';
}

可能不是最好的解决方案,但是有意为之。