2016-06-16 8 views
0

での合計値「注意:未定義のインデックス:トータルカウント」の例は次の:PHP、私は取り除くカントforeachループ

stdClass Object 
(
    [1] => stdClass Object 
     (
      [name] => How do you find our site? 
      [id] => 1 
      [values] => stdClass Object 
       (
        [0] => stdClass Object 
         (
          [value] => Piece of cake 
          [count] => 10 
         ) 

        [3] => stdClass Object 
         (
          [value] => Very Easy 
          [count] => 20 
         ) 

        [4] => stdClass Object 
         (
          [value] => Easy 
          [count] => 30 
         ) 

        [6] => stdClass Object 
         (
          [value] => Hard 
          [count] => 40 
         ) 

       ) 

      [totalcount] => 100 
     ) 

    [2] => stdClass Object 
     (
      [name] => What is your favourite color? 
      [id] => 2 
      [values] => stdClass Object 
       (
        [1] => stdClass Object 
         (
          [value] =>Green 
          [total] => 0 
         ) 

        [2] => stdClass Object 
         (
          [value] => Blue 
          [total] => 0 
         ) 

        [5] => stdClass Object 
         (
          [value] => Red 
          [total] => 0 
         ) 

        [7] => stdClass Object 
         (
          [value] => Black 
          [total] => 0 
         ) 

       ) 

      [totalcount] => 0 
     ) 
) 

それから私は、ループ配列名の値に基づいてソートするのforeachを使用して:

foreach ($array as $i => $row) { 
     if ($id != $row->id) { 
      $id = $row->id; 
      $data[$row->id]['name'] = $row->question; 
      $data[$row->id]['id'] = $row->id; 
     } 
     $data[$row->id]['opts'][$i]['value'] = $row->value; 
     $data[$row->id]['opts'][$i]['count'] = $row->total; 
     $data[$row->id]['totalcount'] += $data[$row->id]['opts'][$i]['count']; 
    } 

ここでもインデックスの通知を受けています "$data[$row->id]['totalcount'] += $data[$row->id]['opts']" 問題の解決方法がわかりません。結果はすべて正しいです、その特定の行の問題だけです。

私はちょうど「」のすべての値を合計し、すべてのヘルプは高く評価されトータルカウントに単一の値として

を割り当てる必要があります。

+2

のようにそれを行うだろうあなたのforeachの開始時に、空の 'totalcount'を初期化します:' $データを[$ row-> id] ['totalcount'] = 0; ' - また、' $ row-> total'を 'totalcount'に追加するだけで、複雑さや文字を保存することができます。 –

+0

$ data [$ row-> id] ['totalcount'] + = $ row-> totalを使用しても、通知を受けています。 – Alko

+0

どこから '$ data'が来ますか? –

答えて

2

通知は、$ data [$ row-> id] ['totalcount']が追加しようとする前に初期化されていないことが原因です。通知はこの状況の結果には影響しませんが、PHPは何が起こっているのかを知りたがっています。

通知を削除する最も簡単な方法は、現在のIDを切り替えるときにその変数の初期化行を追加することですが、行1から行番号8に切り替えることが確実でない場合は、 2に戻り、再び行1に戻ります(または同様のもの)。そのためには、あなたの

if ($id != $row->id) 

ブロックに

$data[$row->id]['totalcount'] = 0; 

を追加します。

最も確実な解決策はただISSET()との組み合わせで初期化ラインを追加することです。

例:

if (isset($data[$row->id]['totalcount'])) 
{ 
    $data[$row->id]['totalcount'] += $data[$row->id]['opts'][$i]['count']; 
} 
else 
{ 
    $data[$row->id]['totalcount'] = $data[$row->id]['opts'][$i]['count']; 
} 
+0

あなたの提案に感謝しますが、 "$ data [$ row-> id] ['totalcount'] = 0;" "if($ id!= $ row-> id)"の直後にカウントが間違っています。 totalcountは2と0になり、100と0でなければなりません。 – Alko

+0

@Alko初期化がifブロックの内部で行われるようにします。上記の私の注意も覚えておいてください。この設定は行IDが連続している場合にのみ正しく動作します。行ID 1と行ID 2の間で前後にジャンプすると、IDが変更されるたびにそのIDの合計数もリセットされるため、機能しません。行IDが連続していると保証できない場合は、代わりに単純なチェックセットを行う必要があります。 – badandyomega

+0

初めてissetを使いましたが、うまくいきませんでしたが、何らかの理由で今動作しています。私の最後にタイプミスされているはずです。ありがとうございます。 – Alko

0

代わりの

$data[$row->id]['totalcount'] += $data[$row->id]['opts'][$i]['count']; 

私はこの

$data[$row->id]['totalcount'] = !isset($data[$row->id]['totalcount']):0?$data[$row->id]['totalcount'] + $data[$row->id]['opts'][$i]['count']; 
+0

まだ良くありません。私は今や100とtotalcountの代わりに22と0で終わります。あなたは逆転していますか?あなたの例では: – Alko