我有一个多维数组,我想从网站管理员打印统计数据。我的问题是,一旦我以我想要的格式将数据导入数组,我就无法弄清楚如何检索它。我必须知道关键值才能得到它,例如$uniqueBrowser["Firefox"]["14.0.1"]['times'];
我希望能够举例说 - Firefox 70%,IE 30%作为开始(聚合浏览器的所有版本'次'使用')。然后,我想深入研究特定版本,例如FF3.6 14%,FF14 51%等(只需打印出与版本相关的时间值)。
编辑:我的问题是,如何以上述方式检索我的数据? 我的头很油炸,我已经这么久了。请有人让我摆脱痛苦。如果有更好的方法,请告诉我。
我到目前为止的代码如下。此代码在每个循环中运行,循环遍历数据库返回的数据。 $browser
和$version
变量设置为foreach
循环每次迭代时从数据库返回的浏览器值和版本值。
if(in_array($browser, $uniqueBrowser)) {
if(in_array($version, $uniqueBrowser[$browser])) {
$uniqueBrowser[$browser][$version]['times'] = $uniqueBrowser[$browser][$version]['times'] + 1;
} else {
$uniqueBrowser[$browser]['version'] = $version;
$uniqueBrowser[$browser][$version]['times'] = 1;
}
} else {
$uniqueBrowser[] = $browser;
$uniqueBrowser[$browser]['version'] = $version;
$uniqueBrowser[$browser][$version]['times'] = 1;
}
当我运行此代码时,它给了我(通过var_dump):
Browser data: array(4) {
[0]=>
string(7) "Firefox"
["Firefox"]=>
array(3) {
["version"]=>
string(6) "14.0.1"
[15]=>
array(1) {
["times"]=>
int(2)
}
["14.0.1"]=>
array(1) {
["times"]=>
int(15)
}
}
[1]=>
string(17) "Internet Explorer"
["Internet Explorer"]=>
array(2) {
["version"]=>
string(9) "8.0.0.253"
["8.0.0.253"]=>
array(1) {
["times"]=>
int(1)
}
}
}
答案 0 :(得分:4)
您应该让数据库为您完成工作,而不是从数据库中获取数据并将其放入复杂数组中,而是以您希望的格式从查询中检索值。
让数据库进行计算,不要使用PHP来执行此操作。它使它过于复杂。
答案 1 :(得分:3)
我知道JvdBerg已经给出了这样的答案,但我先添加了我的评论。所以我不觉得我在抄袭他。
作为一个例子,我创建了以下表结构。希望它像你的一样。
+---------+------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+---------+------------------+------+-----+---------+----------------+
| id | int(11) unsigned | NO | PRI | NULL | auto_increment |
| browser | varchar(120) | YES | | NULL | |
| version | varchar(50) | YES | | NULL | |
+---------+------------------+------+-----+---------+----------------+
然后我再次插入以下行,希望与你的一样。
+----+---------+---------+
| id | browser | version |
+----+---------+---------+
| 1 | Firefox | 3.6 |
| 2 | Firefox | 4.1 |
| 3 | Firefox | 3.6 |
| 4 | Safari | 5.1.7 |
| 5 | Safari | 6 |
| 6 | Firefox | 14.0.1 |
| 7 | IE | 7 |
| 8 | IE | 8 |
| 9 | IE | 7 |
| 10 | Firefox | 14.0.1 |
| 11 | Opera | 12.0.1 |
| 12 | Safari | 5.1.7 |
+----+---------+---------+
然后,以下查询产生了这些结果。
mysql> SELECT browser, version, COUNT(version) AS times FROM demo.browsers GROUP BY browser;
+---------+---------+-------+
| browser | version | times |
+---------+---------+-------+
| Firefox | 3.6 | 5 |
| IE | 7 | 3 |
| Opera | 12.0.1 | 1 |
| Safari | 5.1.7 | 3 |
+---------+---------+-------+
如果您想要更精确,可以使用GROUP BY browser, version
而不是浏览器。
mysql> SELECT browser, version, COUNT(version) AS times FROM demo.browsers GROUP BY browser, version;
+---------+---------+-------+
| browser | version | times |
+---------+---------+-------+
| Firefox | 14.0.1 | 2 |
| Firefox | 3.6 | 2 |
| Firefox | 4.1 | 1 |
| IE | 7 | 2 |
| IE | 8 | 1 |
| Opera | 12.0.1 | 1 |
| Safari | 5.1.7 | 2 |
| Safari | 6 | 1 |
+---------+---------+-------+
答案 2 :(得分:1)
我不确定我是否完全理解您的问题,但您是否尝试使用扩展for循环迭代数组?
例如:
foreach ($uniqueBrowser as $browserName=>$values){
echo $browserName .' contains '. print_r($values,true);
}