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

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

ただいまの
回答率

87.78%

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

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 2,947

score 86

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 )

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

0

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

$count = 0;
foreach ($data as $datum) {
    $count += count($datum);
}

count() の COUNT_RECURSIVE オプションは

array(
    'one',
    'two',
    'three',
    array(
        'apple',
        'banana',
        'melon'
    )
);


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

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/12/17 14:16

    > SQL結果が行ごとのarrayになってしまうのは仕様とかでしょうか?
    「a.access_type」毎に group by しているからではないでしょうか。
    どのような結果を期待されていますか?

    > 正しくカウント というのは、1行14要素 × Array7行 → 98
    > になったということでしょうか?
    そうですね。98です。

    > 僕の場合、SQLの結果の表の表示の前に実行してますが、14と表示されたあと、
    > 表自体のデータも先頭行が表示されなくなりました。countに使用したためでしょうか?
    よろしければ、その辺りのソースも確認させていただけますか。

    キャンセル

  • 2015/12/17 14: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>

    キャンセル

  • 2015/12/18 11: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ファイルも、
    最後にカンマがつかなくなりました。

    キャンセル

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

  • ただいまの回答率 87.78%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る