Search code examples
phpzend-frameworkmultidimensional-arrayzend-dbzend-db-table

Notice: undefined index 'itemid' in foreach construct


I am new to PHP and Zend Framework. I met the error:

Notice: Undefined index: itemid in C:\xampp\htdocs\blogshop\application\views\scripts\item\tops.phtml on line 58

I don't get why this error shows up.

public function topsAction() //tops action
{
    //$tops = new Application_Model_DbTable_Item();
    //$tops->getTops();
    $item = new Application_Model_DbTable_Item(); //create new Item object
    $this->view->item = $item->getTops();  //$this->view->item  is pass to index.phtml
}   

This is my controller code.

public function getTops()
{
    $row = $this->fetchAll('itemtype = "Tops"'); //find Row based on 'Tops'
    if (!$row) { //if row can't be found
        throw new Exception("Could not find Tops!"); //Catch exception where itemid is not found
    }
    return $row->toArray();
}

This is my getTops action in Model to get the rows with category 'Tops' in my database.

<?php foreach($this->item as $item) : ?>
    <?php echo $this->escape($this->item['itemid']);?> // This is where the error happens
    <img src="<?php echo $this->escape($item->image);?>" width="82" height="100">
    <?php echo $this->escape($this->item['itemname']);?>
    <?php echo $this->escape($this->item['description']);?>
    <?php echo $this->escape($this->item['itemtype']);?>
<?php endforeach; ?>

This is my code to display all the rows I have in my database.


Solution

  • There is no index named itemid in your $this->item array, this is why you get the error.

    Also, your code here seems to be a bit wrong:

    <?php foreach($this->item as $item) : ?>
        <?php echo $this->escape($this->item['itemid']);?>
        <img src="<?php echo $this->escape($item->image);?>" width="82" height="100">
        <?php echo $this->escape($this->item['itemname']);?>
        <?php echo $this->escape($this->item['description']);?>
        <?php echo $this->escape($this->item['itemtype']);?>
    <?php endforeach; ?>
    

    Every $this->item inside the foreach statement should be replaced with $item for the iteration to work. So it will be $item['itemid'], $item['itemname'], etc. You are missing to get a level deeper into the array, rendering the iteration foreach useless.

    I guess $this->item looks something like this:

    array (
      1 => 
      array (
        'itemid' => 1,
        'itemname' => 'foobar',
      ),
      2 => 
      array (
        'itemid' => 2,
        'itemname' => 'bazqux',
      ),
    )
    

    This is why $this->item['itemid'] returns nothing, as it does not exist. $this->item[1]['itemid'] however does. What the foreach cycle helps you to do is that it walks (iterates) the whole $this->item array with each value represented as $item inside the cycle. In the first run, $item is $this->item[1], in the second, $item is $this->item[2], and so on, and so forth.

    So, change $this->item to $item inside the foreach construct.