2016-04-04 4 views
2

次のPHP配列を解析しようとしていますが、何とか結果が得られていますが、期待される出力が得られませんでした。次のPHP配列を解析する方法

アレイ:

Array (
     [0] => Array (
       [countNos] => 2 
       [question_id] => 1 
       [question] => Is Service Best? 
       [rating] => 4 
      )  
     [1] => Array (
       [countNos] => 1 
       [question_id] => 2 
       [question] => How much you benifitted? 
       [rating] => 5 
      )  
     [2] => Array (
       [countNos] => 1 
       [question_id] => 2 
       [question] => How much you benifitted? 
       [rating] => 2    
      ) 
    ) 

現在のコード:

お知らせ:未定義のインデックス:Cの星:\ XAMPP \ htdocsにし

foreach ($ratings as $rating) { 

    if (!in_array($rating['question_id'], $ratingArr)) { 
     $ratingArr[$rating['question_id']]['question_id'] = $rating['question_id']; 
     $ratingArr[$rating['question_id']]['question'] = $rating['question']; 
    } 

    for ($i = 5; $i >= 1; $i--) { 

     if (!in_array($rating['rating'], $ratingArr[$rating['question_id']]['stars'])) { 
      if ($i == $rating['rating']) { 
       $ratingArr[$rating['question_id']]['stars'][$i] = $rating['countNos']; 
      } 
     } 
    } 

} 

これは私が取得しています出力されます\ mibs \ module \ Survey \ src \ Survey \ Service \ SurveyService.php on line 153

警告:ライン153

Array (
    [1] => Array (
      [question_id] => 1 
      [question] => Is Service Best? 
      [stars] => Array (
        [4] => 2 
       ) 
     ) 
    [2] => Array (
      [question_id] => 2 
      [question] => How much you benifitted? 
      [stars] => Array (
        [5] => 1 
        [2] => 1 
       ) 
     ) 
) 

の\ XAMPP \ htdocsに\のMIB \モジュール\調査\ SRC \調査\サービス\ SurveyService.php:in_array()は、パラメータ2がヌルCで指定された配列であることを期待しますしかし、私は次の出力を期待しています:

Array(
     [1] => Array(
       [question_id] => 1 
       [question] => Is Service Best? 
       [stars] => Array(
         [5] => 0 
         [4] => 2 
         [3] => 0 
         [2] => 0 
         [1] => 0 
        )  
      )   
     [2] => Array(
       [question_id] => 2 
       [question] => How much you benifitted? 
       [stars] => Array(
         [5] => 1 
         [4] => 0 
         [3] => 0 
         [2] => 1 
         [1] => 0 
        )   
      )   
    ) 

をどのように私は私が解析していたときに、この配列が、私はいつも、私はこれを克服することができますどのように、この種の問題を抱えてい解析することができます。

答えて

3

$ratingArrstarsサブアレイを作成することは決してありません。新しいエントリを初期化すると、2つの警告が発生します。すべてのゼロエントリを取得するには、これを5つのゼロの配列に初期化する必要があります。次に、starsを追加するためのループは必要ありません。適切なエントリを直接入力するだけです。

$rating['question_id']のエントリがすでにあるかどうかを確認するには、array_key_existsではなく、in_arrayを使用する必要があります。$ratingArr

foreach ($ratings as $rating) { 
    if (!array_key_exists($rating['question_id'], $ratingArr)) { 
     $ratingArr[$rating['question_id']]['question_id'] = $rating['question_id']; 
     $ratingArr[$rating['question_id']]['question'] = $rating['question']; 
     $ratingArr[$rating['question_id']]['stars'] = array_fill(1, 5, 0); 
    } 
    $ratingArr[$rating['question_id']]['stars'][$rating['rating']] = $rating['countNos']; 
} 
+1

はちょうどあなたのコードを見て、あなたがループのためにそれを使用する理由尋ねた;)また 'in_array($評価[ 'question_id']、$ ratingArr)'質問IDかどうかを確認ん!の'$ ratingArr'に** value **として存在しますが、これをキーとして使用するので、おそらく' isset() 'または単に' array_key_exsits() 'に変更したいと思うでしょう。 'stars'サブアレイのキーの順序がOPに関係する場合、配列を反転するか、' array_fill_keys() 'を使用することができます。 – Rizier123

+1

もちろん、実際には' array_key_exists'だったのです。 – Barmar

+0

私は今注文が重要ではないと仮定するつもりです。 – Barmar

2

配列をループし、結果配列にquestion idを持つsubArrayがあるかどうかを確認します。そうでない場合は、subArrayを初期化します。そして評価を加えてください。

コード:

<?php 

    $result = []; 

    foreach($array as $v){ 
     if(!isset($result[$v["question_id"]])){ 
      $result[$v["question_id"]] = [ 
        "question_id" => $v["question_id"], 
        "question" => $v["question"], 
        "stars" => array_fill_keys(range(5, 1), 0), 
       ]; 
     } 

     $result[$v["question_id"]]["stars"][$v["rating"]] += $v["countNos"] 

    } 

?> 
関連する問題