从 PHP 多维数组中检索值

Posted

技术标签:

【中文标题】从 PHP 多维数组中检索值【英文标题】:Retrieving values from a PHP Multi-dimensional Array 【发布时间】:2012-09-07 12:24:45 【问题描述】:

我有一个多维数组,我想从中为网站管理员打印统计信息。我的问题是,一旦我以我想要的格式将数据放入数组中,我就无法弄清楚如何检索它。我必须知道关键值才能得到它,例如$uniqueBrowser["Firefox"]["14.0.1"]['times'];

我想说例如 - Firefox 70%,IE 30% 作为开始(聚合浏览器的所有版本“使用时间”)。然后我想进一步深入到特定版本,例如FF3.6 14%、FF14 51% 等(只需打印出与版本相关的时间值)。

编辑:我的问题是,如何以上述方式检索我的数据? 我的头被炸了,我在这方面已经太久了。请有人让我摆脱痛苦。如果有更好的方法可以做到这一点,也请告诉我。

我到目前为止的代码如下。此代码在 for each 循环中运行,该循环遍历数据库返回的数据。 $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)
    
  

【问题讨论】:

@Ivo - 现在更新了我的问题。 在 var_dump 之前添加 echo '<pre>'; 并在此处给出新结果。现在很难读取这个数组。 如果您在查询中使用COUNTGROUP BY,它应该会让事情变得更容易一些。 现在添加了格式化的 var_dump 数据。谢谢你的提示。使其更易于阅读并注意到版本数据也存在问题,即键值错误。 【参考方案1】:

您应该让数据库为您完成工作,并以您想要的格式从查询中检索值,而不是从数据库中获取数据并将其放入复杂的数组中。

让数据库来做计算,不要用 php 来做。它使它变得过于复杂。

【讨论】:

谢谢,按照您和 Baylor 的建议,使用基于数据库的解决方案。【参考方案2】:

我知道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 |
+---------+---------+-------+

【讨论】:

非常相似,是的。谢谢,我现在就试试这个并报告它是如何进行的。会让事情变得更容易,没有人来维护页面会诅咒我:)【参考方案3】:

我不确定我是否完全理解您的问题,但您是否尝试过使用扩展的 for 循环遍历数组?

例如:

foreach ($uniqueBrowser as $browserName=>$values)

    echo $browserName .' contains '. print_r($values,true);


【讨论】:

以上是关于从 PHP 多维数组中检索值的主要内容,如果未能解决你的问题,请参考以下文章

使用php从多维数组中获取子数组

如何从 PHP 中的多维数组中删除重复值

从php中的多维数组中删除重复值

如何从 PHP 中的多维数组中删除重复值 [重复]

使用 PHP 存储和检索多维数组

PHP使用字符串替换从多维数组中的键值替换关键字