2016-04-04 24 views
2

Aşağıdaki php dizisini ayrıştırmaya çalışıyorum, bir şekilde sonucu alıyorum, ancak beklenen çıktıyı alamadım.Aşağıdaki php dizisini ayrıştırma

Dizisi:

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    
      ) 
    ) 

Güncel kodu:

Uyarı: Undefined index: yıldız C:

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']; 
      } 
     } 
    } 

} 

Bu alıyorum çıkışı \ xampp \ htdocs \ mibs \ module \ Anket \ src \ Anket \ Servis \ SurveyService.php on line 153

Uyarı: \ xampp \ htdocs \ mibs \ modül \ Araştırması \ src \ Araştırması \ Hizmet \ SurveyService.php hattında 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 
       ) 
     ) 
) 

: in_array() parametresi 2 dizi boş C verilen olmasını bekler Ama şu çıktıyı bekliyorum:

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 
        )   
      )   
    ) 

bu diziyi ben hep bu nasıl kurtulur, ben ayrıştırma am zaman, konunun bu tür yaşıyorum ayrıştırmak nasıl.

cevap

3

$ratingArr numaralı telefona yeni bir giriş başlattığınızda stars alt dizini oluşturmazsınız, bu iki uyarıya neden olur. Tüm sıfır girdileri almak için, bunu 5 sıfırdan oluşan bir diziye başlatmalısınız. O zaman, stars'u eklemek için bir döngüye ihtiyacınız yoktur, sadece uygun girişi doğrudan doldurabilirsiniz.

içinde $rating['question_id'] için bir giriş olup olmadığını kontrol etmek için array_key_exists, in_array kullanmanız gerekir.

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

Sadece kod inceledik ve döngü için, kullanılan niçin sordum;) Ayrıca 'in_array ($ değerlendirmesi [ 'question_id'], $ ratingArr)' onay durumunda soru kimliği $ ratingArr'da ** değeri ** olarak bulunur, ancak bunu anahtar olarak kullanırsınız, bu yüzden muhtemelen bunu 'isset()' veya sadece 'array_key_exsits()' olarak değiştirmek istersiniz. Ve eğer 'yıldız' alt-dizisindeki tuşların sırası OP için önemliyse, ya diziyi çevirebilir ya da 'array_fill_keys()' – Rizier123

+1

kullanabilirsiniz. Elbette, aslında ne demek 'array_key_exists' idi. – Barmar

+0

Şimdi siparişin önemli olmadığını varsayacağım. – Barmar

2

Dizininizden geçirin ve sonuç dizisinde soru kimliğine sahip bir altArray olup olmadığını kontrol edin. Değilse, altArray'ı başlatın. Ve sonra sadece derecelendirmeyi ekleyin.

Kodu:!

<?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"] 

    } 

?> 
İlgili konular