Skip to content
Advertisement

Problem with PHP object and foreach loop, object not properly storing values

I’m trying to get values from a file called input.csv and add it to an object called $myItem. I’m using a foreach method to do so, as you can see. For some reason that is unclear to me, the values of the object are getting mixed up.

When I initially set the value of $item_number using my setter method the value is the correct value – the first entry in the first row of input.csv. However, by the time the foreach loop is completed, the value has changed to the last entry in the first row of input.csv.

This is true for all the instance variables in the object $myItem, they’re all changing to the last entry in the first row of input.csv. I’m not sure why.

Here is my code:

<?php
  class Item
  {
    private $item_number;
    private $name;
    private $type;
    private $make;
    private $model;
    private $brand;
    private $description;

    // Item Number
    function SetItemNumber($value)
    {
      $this->item_number = $value;
    }

    function GetItemNumber()
    {
      return $this->item_number;
    }

    // Name
    function SetName($value)
    {
      $this->item_number = $value;
    }

    function GetName()
    {
      return $this->name;
    }

    // Type
    function SetType($value)
    {
      $this->item_number = $value;
    }

    function GetType()
    {
      return $this->type;
    }

    // Make
    function SetMake($value)
    {
      $this->item_number = $value;
    }

    function GetMake()
    {
      return $this->make;
    }

    // Model
    function SetModel($value)
    {
      $this->item_number = $value;
    }

    function GetModel()
    {
      return $this->model;
    }

    // Brand
    function SetDescription($value)
    {
      $this->item_number = $value;
    }

    function GetDescription()
    {
      return $this->description;
    }

    // Brand
    function SetBrand($value)
    {
      $this->item_number = $value;
    }

    function GetBrand()
    {
      return $this->brand;
    }
  }

  $file = fopen("input.csv", "r");

  $myItem = new Item;

  foreach (fgetcsv($file) as $key => $value) {

    switch ($key) {
      case 0:
        $myItem->SetItemNumber($value);
        echo $myItem->GetItemNumber(); // prints first value in first row of input.csv
        break;
      case 1:
        $myItem->SetName($value);
        break;
      case 2:
        $myItem->SetType($value);
        break;
      case 3:
        $myItem->setMake($value);
        break;
      case 4:
        $myItem->setModel($value);
        break;
      case 5:
        $myItem->setBrand($value);
        break;
      case 6:
        $myItem->setDescription($value);
        break;
    }
  }

  echo $myItem->GetItemNumber(); // ??? prints last value of first row of input.csv.
  // This is the value that you should only get from getDescription().

  fclose($file);
  ?>

Thanks in advance for any help!

Advertisement

Answer

Take a look at your setter methods, all of them are doing:

 $this->item_number = $value;
User contributions licensed under: CC BY-SA
2 People found this is helpful
Advertisement