如何从php页面中的嵌套foreach循环(按类别加载产品)获取值?

时间:2017-08-07 08:40:44

标签: php arrays

  

我想获取所有值以显示它们的php前端页面。我有   数据库中有两个表。   1)类别 - cat_id,cat_name; 2)产品 - pro_id,cat_id,cat_name,pro_name,price;

     

我的 product.php 文件代码:

<div class="content">
                <div class="content_top">
                   <?php
                      $product = new Product();
                      $getProduct = $product->getAllProduct();
                        if(!empty($getProduct)){
                            foreach($getProduct as $categoryName) {
                    ?>
                    <div class="heading">
                        <h3>Latest from <?php echo $categoryName['cat_name']; ?></h3>
                    </div>
                </div>
                   <?php foreach($getProduct['cat_name'] as $detail=> $row){?>
               <div class="section group">
                    <h2><?php echo $row['product_id']?></h2>
                    <h2><?php echo $row['product_name']?></h2>
                    <p><?php echo $row['price']?></p>
               </div>
                  <?php  } } } ?>           
            </div>
  

我的 Product.php类文件代码:

public function getAllProduct(){
        $query = "SELECT p.*, c.cat_name, b.brand_name
                  FROM product as p, category as c, brand as b
                  WHERE p.cat_id = c.cat_id AND p.brand_id= b.brand_id 
                  ORDER BY p.product_id DESC";

        $data = $this->db->select($query);
        $result = $data->fetch_all();
        $product = array();
        $product1  = array();
        foreach($result as $row) {
            $product[$row[2]] = array(
                'cat_id' => $row[2],
                'cat_name' => $row[8]
            );
            $product1[$row[2]][$row[0]] = array(
                'product_id' => $row[0],
                'product_name' => $row[1],
                'price' => $row[5]
            );
        }
        $product2 =array();
        foreach($product as $id=> $val ) {
            $tmp = array(
                $id => array(
                    'cat_id' => $val['cat_id'],
                    'cat_name' => $val['cat_name'],
                    'product' => $product1[$id],
            ));
            array_push($product2, $tmp);
        }
        return $product2;
    }

**

  

但输出显示如下错误:最新消息:未定义   index:第10行中的cat_name注意:未定义的索引:行中的cat_name   13警告:第13行中为foreach()提供的参数无效

**

2 个答案:

答案 0 :(得分:0)

您使用的是二维数组:

$tmp = array(
            $id => array(
                'cat_id' => $val['cat_id'],
                'cat_name' => $val['cat_name'],
                'product' => $product1[$id],
        ));

但按原样访问它是一维的:

echo  $categoryName['cat_name']

首先,var_dump你的数组,以准确查看它包含的数据。然后访问它适当的深度。

答案 1 :(得分:0)

我可以看到两个问题:

foreach($result as $row) {
    $product[$row[2]] = array(
        'cat_id' => $row[2],
        'cat_name' => $row[8]
    );
    $product1[$row[2]][$row[0]] = array(
        'product_id' => $row[0],
        'product_name' => $row[1],
        'price' => $row[5]
    );
}

不要使用索引,请使用字符串键。这样,通过查看调用的键,你就会知道你正在使用什么数据,这样会更难犯错误。此外,通过使用数字索引,更改您在查询中选择的字段的顺序,或者只是添加/删除一个将会搞砸您的代码,因为索引将索引不同的信息。

foreach($product as $id=> $val ) {
    $tmp = array(
        $id => array(
            'cat_id' => $val['cat_id'],
            'cat_name' => $val['cat_name'],
            'product' => $product1[$id],
    ));
    array_push($product2, $tmp);
}

通过这样做,$product2的输出将如下所示 - 假设您获得的条目的ID是连续的:

array(
    0 => array(
        0 => array(
            'cat_id' => '<some id>',
            'cat_name' => '<some name>',
            'product' => array(
                'product_id' => '<some id>',
                'product_name' => '<some name>',
                'price' => '<some price>'
            )
        )
    ),
    1 => array(
        1 => array(
            'cat_id' => '<some id>',
            'cat_name' => '<some name>',
            'product' => array(
                'product_id' => '<some id>',
                'product_name' => '<some name>',
                'price' => '<some price>'
            )
        )
    ),
    2 => array(
        2 => array(
            'cat_id' => '<some id>',
            'cat_name' => '<some name>',
            'product' => array(
                'product_id' => '<some id>',
                'product_name' => '<some name>',
                'price' => '<some price>'
            )
        )
    ),
    3 => array(
        3 => array(
            'cat_id' => '<some id>',
            'cat_name' => '<some name>',
            'product' => array(
                'product_id' => '<some id>',
                'product_name' => '<some name>',
                'price' => '<some price>'
            )
        )
    ),
    etc...
);

因此,将此数组放在您的其他文件中并以这种方式使用它:

$getProduct['cat_name']

无效,因为'cat_name'位于$getProduct数组中的数组中。

foreach($getProduct as $categoryName) {
    echo $categoryName['cat_name'];
}

也不起作用,你不够深入访问它,你需要再次预告。

你应该把它放在Product.php

    foreach($product as $id=> $val ) {
        $product2[$id] = array(
            'cat_id' => $val['cat_id'],
            'cat_name' => $val['cat_name'],
            'product' => $product1[$id],
        );
    }

并将line 13 product.php的块替换为:

    <div class="section group">
        <h2><?php echo $categoryName['product']['product_id']?></h2>
        <h2><?php echo $categoryName['product']['product_name']?></h2>
        <p><?php echo $categoryName['product']['price']?></p>
    </div>
<?php  } } ?>

你不需要你的foreach,因为你只需要查看已经在['product']中的$categoryName