2017-08-29 47 views
-2

我已经编写了从cURL源读取数据的代码,该数据源然后处理它以提取数据记录。在foreach循环中创建的实例是重复的

每条记录​​都将成为一个对象的一个​​实例,其中有几个从数据中设置的变量。一个函数提取所有数据并返回一个对象数组。

问题是所有对象都具有相同的值,这是从源数据读取的最后一条记录。

经过一番测试后,我意识到这是一个参考问题。数据从源读取,然后分配给一个对象,然后将其添加到数组中。同一个对象在遍历源代码中所有记录的循环中被重用。无论何时更新此对象,数组中对象的所有先前值都会重置为最新值,因为它们在更新时会继续引用该对象。

如何让所有的值独立?

function get_object_array() { 
     //reads raw data from cRUL source, returns array of objects 

     //array to hold objects 
     obj_arr = []; 

     //raw data has been split into array called $record, one element for each object 
     //loops through $record array 
      foreach ($record as $rec) { 
       //splits $rec into array of data called $data 
       //creates new object, but problem here as this object 
       //is being referenced by all values so last value 
       //changes all previous objects in array 
       $obj = new SaleItem(); 
       //populates object with record data array 
       $obj->set_data($data); 
       //add object to array 
       $obj_arr [] = $obj;  
      } 
     return $obj_arr; 
    } 

更新:这里是设置数据的功能:

function set_data (array $arr) { 
     global $order_num, $name, $price, $cprice, $cheapest, $category; 
     try { 
      $order_num = (int)$arr[0]; 
      $name = $arr[1]; 
      $price = (float)$arr[2]; 
      $cprice = (float)$arr[3]; 
      $cheapest = $this->$price <= $this->$cprice ? true : false; 
      $category = $arr[5]; 
      return true; 
     } 
     catch (Exception $ex) { 
      echo $ex; 
      return false; 
     } 
    } 

更新:满级代码:

class SaleItem { 
    public $order_num = 12; 
    public $name = ""; 
    public $price = 3.4; 
    public $cprice = 5.6; 
    public $cheapest = true; 
    public $category = "No Category"; 

    function set_data (array $arr) { 
     try { 
      $this->order_num = (int)$arr[0]; 
      $this->name = $arr[1]; 
      $this->price = (float)$arr[2]; 
      $this->cprice = (float)$arr[3]; 
      $this->cheapest = $price <= $cprice ? true : false; 
      $this->category = $arr[5]; 
      return true; 
     } 
     catch (Exception $ex) { 
      echo $ex; 
      return false; 
     } 
    } 

    function get_data() { 
     echo $this->order_num . ' num<br/>'; 
     echo $this->name . ' name<br/>'; 
     echo $this->price . ' price<br/>'; 
     echo $this->cprice . ' cprice<br/>'; 
     echo $this->cheapest . ' cheapest<br/>'; 
     echo $this->category . ' category<br/>'; 
     echo '<br/>'; 
    } 

}//end SaleItem class 
+0

岂不是'$ obj-> set_data($ REC)各分配;'? –

+0

'$ data'从哪里来? – yivi

+0

$数据在进一步处理后从$ rec衍生。 $ rec是一个包含6个值的字符串,$ data是一个数组,这些值被拆分并从字符串中清除。 – Kwangle

回答

2

您正在使用的,而不是成员的全局变量。删除

global $order_num, $name, $price, $cprice, $cheapest, $category; 

从功能上和前面加上$这个 - >

$this->order_num = (int)$arr[0]; 
     $this->name = $arr[1]; 
     $this->price = (float)$arr[2]; 
     $this->cprice = (float)$arr[3]; 
     $this->cheapest = $this->price <= $this->cprice; 
     $this->category = $arr[5]; 
+0

不,$ rec需要进一步处理(未显示)才能将其转换为set_data函数可以使用的值的数组。我测试了代码,在这一点上数据是正确的,但是每当$ obj被更新的数据更新时,它就会改变,使得所有以前的值也变得相同。谢谢。 – Kwangle

+0

我们需要看到SaleItem :: set_data和任何子功能。如果在调用set_data时$ data是正确的,则问题在于对象的分配。 $数据的设置也是有用的,即使它是伪造/评论的代码段以供参考。 –

+0

根据您的新信息进行编辑。您正在分配全局变量,这些变量在每个实例中都是相同的,而不是特定于成员的变量。 –