2016-07-05 3 views
1

値置き換え:PHP配列の最後に追加したが、すべての格納された配列は、私が何をしようとしている

  1. は、データベースから結果を取得します。
  2. stdClassに割り当てて必要な値を取得します。
  3. これらのオブジェクトを配列に配置します。 (< - 問題)
  4. JSONとして出力します。

オブジェクトは正しい値を取得できます。しかし、配列に一度割り当てられると、以前のすべての配列値が置換されます。

DBの処理にCodeIgniterを使用しています。

機能:

function get_prizes(){ 

    //All prize objects are stored here 
    $prizes = array(); 

    //Prize object 
    $prize = new stdClass(); 
    $prize->name1 = ''; 
    //$prize->type = ''; 

    //Getting the prizes from a simple database table 
    $query = $this->db->get('prizes'); 

    if($query->num_rows() > 0){ 

     foreach ($query->result() as $row): 

      $prize_name = $row->prize_name; 
      $prize->name1 = $prize_name; 
      //$prize->type = $prize_name; 

      $prizes[] = $prize; 

      echo " Item: " . print_r($prizes, true) . "<br>"; 

     endforeach; 

    } 

    echo json_encode($prizes); 

} 

出力:

Item: Array ([0] => stdClass Object ([name1] => Radio)) 
Item: Array ([0] => stdClass Object ([name1] => Television) [1] => stdClass Object ([name1] => Television)) 
Item: Array ([0] => stdClass Object ([name1] => Toaster) [1] => stdClass Object ([name1] => Toaster) [2] => stdClass Object ([name1] => Toaster)) 
[{"name1":"Toaster"},{"name1":"Toaster"},{"name1":"Toaster"}] 

私が試したarray_push()。同じこともします。

答えて

2

あなたはforeachループ内でオブジェクトをインスタンス化する必要があります。

function get_prizes() 
{ 
    // All prize objects are stored here 
    $prizes = array(); 

    // Getting the prizes from a simple database table 
    $query = $this->db->get('prizes'); 
    if ($query->num_rows() > 0) { 
     foreach($query->result() as $row): 

      // Prize object  
      $prize = new stdClass(); 

      // $prize->type = ''; 
      $prize->name1 = $row->prize_name; 

      $prizes[] = $prize; 

     endforeach; 
    } 

    echo json_encode($prizes); 
} 
+0

ありがとうございました、完璧に動作します。内部でインスタンス化する必要があるのはなぜですか?そして、配列内の値が既に割り当てられている場合、値はどのように変化しますか? –

+1

PHPオブジェクトは参照渡しであるため、ループの外にオブジェクトを作成すると、各繰り返しで1つのオブジェクトのみが使用され、配列に(異なるインデックスで)追加されます。プロパティ 'name1'は' Toaster'の最後の値を保持します。したがって、各反復で新しいオブジェクトを作成する必要があります。 –

関連する問題