質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

1回答

4147閲覧

SQLの実行結果から取得した配列の全要素数を取得したい。

Satochan24

総合スコア113

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

0クリップ

投稿2015/12/17 03:04

PHP上で、SQLを実行し、それを連想配列に変換する処理をしたのですが、その連想配列の要素数を取得しようと、
countを使うのですが、一つの行の要素数しか出てきません。
全部の要素数を取得する方法はありますでしょうか?

SQLの実行結果が$result
それに対して、mysqli_fetch_arrayの処理をして、変数
$dataに格納。

$data = mysqli_fetch_array($result,MYSQLI_ASSOC)

その$dataにcount($data)を実行しても、行の要素数14しか
表示されない。
echo count($data,COUNT_RECURSIVE);
としても同じ。

$dataの中身を念のため、確認してみると以下の通り。Arrayごとに分かれてしまっているためか!?
なぜ分かれるのかは不明です。

print_r($data);

【$dataの中身】
Array ( [access_type] => (102) [this] => 6 [one] => 44 [two] => 6 [three] => 0 [four] => 0 [five] => 0 [six] => 0 [seven] => 0 [eight] => 0 [nine] => 0 [ten] => 0 [eleven] => 0 [year] => 0 ) Array ( [access_type] => (201) [this] => 6 [one] => 40 [two] => 15 [three] => 0 [four] => 0 [five] => 0 [six] => 0 [seven] => 0 [eight] => 0 [nine] => 0 [ten] => 0 [eleven] => 0 [year] => 0 ) Array ( [access_type] => (103) [this] => 1 [one] => 22 [two] => 5 [three] => 0 [four] => 0 [five] => 0 [six] => 0 [seven] => 0 [eight] => 0 [nine] => 0 [ten] => 0 [eleven] => 0 [year] => 0 ) Array ( [access_type] => (301) [this] => 1 [one] => 8 [two] => 4 [three] => 5 [four] => 18 [five] => 0 [six] => 0 [seven] => 0 [eight] => 0 [nine] => 0 [ten] => 0 [eleven] => 0 [year] => 0 ) Array ( [access_type] => (202) [this] => 0 [one] => 16 [two] => 2 [three] => 0 [four] => 0 [five] => 0 [six] => 0 [seven] => 0 [eight] => 0 [nine] => 0 [ten] => 0 [eleven] => 0 [year] => 0 ) Array ( [access_type] => (203) [this] => 0 [one] => 12 [two] => 4 [three] => 0 [four] => 0 [five] => 0 [six] => 0 [seven] => 0 [eight] => 0 [nine] => 0 [ten] => 0 [eleven] => 0 [year] => 0 ) Array ( [access_type] => (204) [this] => 0 [one] => 1 [two] => 2 [three] => 0 [four] => 0 [five] => 0 [six] => 0 [seven] => 0 [eight] => 0 [nine] => 0 [ten] => 0 [eleven] => 0 [year] => 0 )

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

ループでカウントするしかないですかね。。。

PHP

1$count = 0; 2foreach ($data as $datum) { 3 $count += count($datum); 4}

count() の COUNT_RECURSIVE オプションは

PHP

1array( 2 'one', 3 'two', 4 'three', 5 array( 6 'apple', 7 'banana', 8 'melon' 9 ) 10);

のような配列の要素数をカウントするときに使用するものだったかと。

投稿2015/12/17 03:51

編集2015/12/17 04:44
hyper-drums-ko

総合スコア736

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Satochan24

2015/12/17 04:27

回答有難ございます。 試してみたのですが、やはり14(1行の要素数)になってしまいました。 ループの設置場所の問題でしょうか? また、そもそも、SQL結果が行ごとのarrayになってしまうのは仕様とかでしょうか?
hyper-drums-ko

2015/12/17 04:46

> 試してみたのですが、やはり14(1行の要素数)になってしまいました。 > ループの設置場所の問題でしょうか? 念のためこちらでも試してみましたが、正しくカウントできているんですよね。。。 > SQL結果が行ごとのarrayになってしまうのは仕様とかでしょうか? どのようなSQLを実行されたか見せていただくことは可能でしょうか。
Satochan24

2015/12/17 05:04

回答有難うございました。 正しくカウント というのは、1行14要素 × Array7行 → 98 になったということでしょうか? 僕の場合、SQLの結果の表の表示の前に実行してますが、14と表示されたあと、 表自体のデータも先頭行が表示されなくなりました。countに使用したためでしょうか? SQLを記載します。カウント集計を月ごとにしているSQLです。  SELECT a.access_type, COUNT(CASE WHEN date_format(a.access_day, '%Y-%m') = date_format(now(), '%Y-%m') THEN 1 ELSE NULL END) AS 'this', COUNT(CASE WHEN date_format(a.access_day, '%Y-%m') = date_format(DATE_SUB(now(),INTERVAL 1 MONTH), '%Y-%m') THEN 1 ELSE NULL END) AS 'one', COUNT(CASE WHEN date_format(a.access_day, '%Y-%m') = date_format(DATE_SUB(now(),INTERVAL 2 MONTH), '%Y-%m') THEN 1 ELSE NULL END) AS 'two', COUNT(CASE WHEN date_format(a.access_day, '%Y-%m') = date_format(DATE_SUB(now(),INTERVAL 3 MONTH), '%Y-%m') THEN 1 ELSE NULL END) AS 'three', COUNT(CASE WHEN date_format(a.access_day, '%Y-%m') = date_format(DATE_SUB(now(),INTERVAL 4 MONTH), '%Y-%m') THEN 1 ELSE NULL END) AS 'four', COUNT(CASE WHEN date_format(a.access_day, '%Y-%m') = date_format(DATE_SUB(now(),INTERVAL 5 MONTH), '%Y-%m') THEN 1 ELSE NULL END) AS 'five', COUNT(CASE WHEN date_format(a.access_day, '%Y-%m') = date_format(DATE_SUB(now(),INTERVAL 6 MONTH), '%Y-%m') THEN 1 ELSE NULL END) AS 'six', COUNT(CASE WHEN date_format(a.access_day, '%Y-%m') = date_format(DATE_SUB(now(),INTERVAL 7 MONTH), '%Y-%m') THEN 1 ELSE NULL END) AS 'seven', COUNT(CASE WHEN date_format(a.access_day, '%Y-%m') = date_format(DATE_SUB(now(),INTERVAL 8 MONTH), '%Y-%m') THEN 1 ELSE NULL END) AS 'eight', COUNT(CASE WHEN date_format(a.access_day, '%Y-%m') = date_format(DATE_SUB(now(),INTERVAL 9 MONTH), '%Y-%m') THEN 1 ELSE NULL END) AS 'nine', COUNT(CASE WHEN date_format(a.access_day, '%Y-%m') = date_format(DATE_SUB(now(),INTERVAL 10 MONTH), '%Y-%m') THEN 1 ELSE NULL END) AS 'ten', COUNT(CASE WHEN date_format(a.access_day, '%Y-%m') = date_format(DATE_SUB(now(),INTERVAL 11 MONTH), '%Y-%m') THEN 1 ELSE NULL END) AS 'eleven', COUNT(CASE WHEN date_format(a.access_day, '%Y-%m') = date_format(DATE_SUB(now(),INTERVAL 12 MONTH), '%Y-%m') THEN 1 ELSE NULL END) AS 'year' FROM access_record AS a GROUP BY a.access_type ORDER BY COUNT(CASE WHEN date_format(a.access_day, '%Y-%m') = date_format(now(), '%Y-%m') THEN 1 ELSE NULL END) DESC,a.access_type
hyper-drums-ko

2015/12/17 05:16

> SQL結果が行ごとのarrayになってしまうのは仕様とかでしょうか? 「a.access_type」毎に group by しているからではないでしょうか。 どのような結果を期待されていますか? > 正しくカウント というのは、1行14要素 × Array7行 → 98 > になったということでしょうか? そうですね。98です。 > 僕の場合、SQLの結果の表の表示の前に実行してますが、14と表示されたあと、 > 表自体のデータも先頭行が表示されなくなりました。countに使用したためでしょうか? よろしければ、その辺りのソースも確認させていただけますか。
Satochan24

2015/12/17 05:42

回答有難うございます。 group by しないと集計できないですよね。 最終目標は、集計結果のグラフをGoogleChartsで作りたくて(他の方法でも良いのですが)、そのためにJSON形式でデータを掃き出したく、掃き出してみたら、行ごとにカンマがなく、グラフを描く読み込みができなかったので、PHPでカンマを追加させる処理を書いたら、最終行までカンマが付いたので、じゃあ、要素数をカウントして最後だけカンマつけない処理にしようと考えて…という流れです。 PHPのソース、下記です。少し編集したので、もしかしたらエラーになるかもしれませんが、大まかな流れはご理解頂けるかと思います。 何度もすみません。 <?php //SQLはファイルから読み込む $sql_3 = file_get_contents("test3.sql"); // SQLクエリを実行する $result_3 = mysqli_query($link, $sql_3); //$data = mysqli_fetch_array($result); ?> <div style="padding:20pt"> <h2>【機能別使用数】&nbsp;<span style="font-size:60%;">※今月の使用頻度順</span></h2> <table width="100%"> <tr style="border-bottom:3px solid blue;"> <th scope="col">TOP</th> <th scope="col">アクセスタイプ</th> <th scope="col" style="background-color:blue;">今月</th> <th scope="col">1ヶ月前</th> <th scope="col">2ヶ月前</th> <th scope="col">3ヶ月前</th> <th scope="col">4ヶ月前</th> <th scope="col">5ヶ月前</th> <th scope="col" style="background-color:blue;">半年前</th> <th scope="col">7ヶ月前</th> <th scope="col">8ヶ月前</th> <th scope="col">9ヶ月前</th> <th scope="col">10ヶ月前</th> <th scope="col">11ヶ月前</th> <th scope="col" style="background-color:blue;">1年前</th> </tr> <?php $i = 1; $c = 0; $file = 'array.json'; //$fp = fopen('php://output', 'w'); $data = mysqli_fetch_array($result_3,MYSQLI_ASSOC); //echo count($data,COUNT_RECURSIVE); //var_dump($data); $count = 0; foreach ($data as $datum) { $count += count($datum); } echo $count; while($data = mysqli_fetch_array($result_3,MYSQLI_ASSOC)){ ?> <?php if ($c % 2) { print('<tr style="background-color: #bce0f2">'); } else { print('<tr>'); } ?> <?php print('<td style="text-align:center;">' . $i . '</td>'); $i++ ?> <td style="text-align:left;border-right:3px;border-right-color: #0000ff; border-right-style: double;"><?php print $data['access_type']; ?></td> <td><?php print $data['this']; ?></td> <td><?php print $data['one']; ?></td> <td><?php print $data['two']; ?></td> <td><?php print $data['three']; ?></td> <td><?php print $data['four']; ?></td> <td><?php print $data['five']; ?></td> <td><?php print $data['six']; ?></td> <td><?php print $data['seven']; ?></td> <td><?php print $data['eight']; ?></td> <td><?php print $data['nine']; ?></td> <td><?php print $data['ten']; ?></td> <td><?php print $data['eleven']; ?></td> <td><?php print $data['year']; ?></td> </tr> <?php $c++; file_put_contents($file, json_encode($data,JSON_NUMERIC_CHECK) . ",", FILE_APPEND); //print_r($data); }//while終わり ?> </table>
Satochan24

2015/12/18 02:52

苦し紛れですが、何とかほしい情報は取得できた感じです。 SQLクエリの実行をそれぞれ別変数にわけました。 // SQLクエリを実行する $result_3 = mysqli_query($link, $sql_3); $result_4 = mysqli_query($link, $sql_3); $result_5 = mysqli_query($link, $sql_3); //1行の要素数14取得 $count_2 = 0; $data_3 = mysqli_fetch_array($result_5,MYSQL_ASSOC); foreach($data_3 as $datum){ $count_2 += count($datum); } echo $count_2; //1行の14取得 //行数の8取得 $count = 0; while ($data_2 = mysqli_fetch_array($result_4,MYSQLI_ASSOC)) { $count++; } echo $count; //8行取得 //欲しい全体の要素数取得 $access_type_count = $count * $count_2; echo $access_type_count; //14x8=112取得 ただ、実際、 while($data = mysqli_fetch_array($result_3,MYSQLI_ASSOC)) のところでの繰り返しの数は、行数の8だったようで、 行数が8未満かどうかで場合分けしたら、掃き出されるJSONファイルも、 最後にカンマがつかなくなりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問