2

ウェブサイト管理者のために統計を印刷したい多次元配列があります。私の問題は、データを希望の形式で配列に入れると、それを取得する方法がわからないことです。私はそれを得るために重要な値を知らなければなりません例えば$uniqueBrowser["Firefox"]["14.0.1"]['times'];

たとえば、Firefox 70%、IE 30%を開始点として言いたいです(ブラウザで「使用された回数」のすべてのバージョンを集計します)。次に、特定のバージョン、たとえばFF3.6 14%、FF14 51%などにさらにドリルダウンしたいと思います(バージョンに関連付けられた時間の値を出力するだけです)。

編集:私の質問は、上記の方法でデータを取得するにはどうすればよいですか?私の頭は揚げられており、私はこれに長い間取り組んできました。誰かが私の惨めさから私を追い出してください。これを行うためのより良い方法があれば、私にも知らせてください。

私がこれまでに持っているコードは以下の通りです。このコードは、データベースから返されたデータを反復処理するforeachループで実行されます。および変数は$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)
    }
  }
}
4

3 に答える 3

4

データベースからデータを取得して複雑な配列に入れる代わりに、データベースに作業を任せて、必要な形式でクエリから値を取得する必要があります。

計算はデータベースに任せ、PHP を使用しないでください。それはそれを複雑にします。

于 2012-09-07T12:36:49.953 に答える
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 |
+---------+---------+-------+
于 2012-09-07T12:44:44.387 に答える
1

あなたの質問を完全に理解しているかどうかはわかりませんが、拡張 for ループを使用して配列を反復処理しようとしましたか?

例えば:

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

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

}
于 2012-09-07T12:34:36.257 に答える