You need to enable JavaScript to run this app. PHP中如何从stdClass对象获取指定字符串,实现分类及关联产品正确展示
优惠活动
大模型
产品
解决方案
定价
更多

PHP中如何从stdClass对象获取指定字符串,实现分类及关联产品正确展示

问题核心原因

你遇到的展示异常完全是三个逻辑错位导致的:

  • 模板外层循环的变量对应关系搞反:$data['prod']是分类对象组成的索引数组,你写的foreach($data['prod'] as $cats => $pros)里,$cats拿到的是数组的数字键(也就是你页面上看到的0、1这类索引值),真正的分类对象反而被传给了后面的$pros变量,所以标题位置才会显示数字
  • 后端构造数据时覆盖了原有字段:循环里把分类对象本来存储分类ID的id属性,直接赋值成了关联产品列表,打乱了原有分类对象的结构
  • 内层循环直接输出对象:遍历产品时拿到的是每个产品的stdClass对象,没有读取对象上的具体字段,直接输出对象本身会触发类型转换错误
后端数据逻辑修正

原来的逻辑会覆盖分类的原有id字段,应该新增独立属性存关联产品,不要改动原有分类的原生字段:

$get_cat = $this->AdminModel->getcategorie();

foreach ($get_cat as $cat) {
    // 单独新增products属性存关联产品列表,不覆盖原有的id、分类名等字段
    $cat->products = $this->AdminModel->getproducts($cat->id);
}

$data = ['prod' => $get_cat];

改完后每个分类对象会保留原来的所有表字段(比如分类ID、分类名称等),同时附带一个products属性存该分类下的所有关联产品。

前端模板逻辑修正

把循环的变量对应关系理清楚,直接从对象上读取对应字段值,不要用错位的键值解构:

<?php foreach($data['prod'] as $cat): // 直接获取每个分类对象,不再做错误的键值拆分 ?>
<div class="container-fluid">
    <div class="card card-default collapsed-card">
        <div class="card-header">
            <!-- 替换成你分类表中存储分类名称的实际字段名,比如分类表字段叫cat_name就写$cat->cat_name -->
            <h3 class="card-title"><?php echo $cat->cat_name; ?></h3>
        </div>
        <div class="card-body">
            <table class="table table-bordered table-striped">
                <thead>
                    <tr>
                        <th>#</th>
                        <th>Product Name</th>
                        <th>Edit</th>
                        <th>Delete</th>
                    </tr>
                </thead>
                <tbody>
                    <?php $i=1; foreach($cat->products as $pro): // 从分类对象的products属性里遍历关联产品 ?>
                    <tr>
                        <td><?php echo $i++; ?></td>
                        <!-- 替换成你产品表中存储产品名称的实际字段名,比如产品表字段叫product_name就写$pro->product_name -->
                        <td><?php echo $pro->product_name; ?></td>
                        <td>Edit</td>
                        <td>Delete</td>
                    </tr>
                    <?php endforeach; ?>
                </tbody>
            </table>
        </div>
    </div>
</div>
<?php endforeach; ?>
调试技巧

如果不确定自己的查询返回的对象具体有哪些字段,直接在循环里临时跑一行var_dump($cat); exit;,看打印出来的stdClass的属性名,对应填到模板里就行,不用硬猜字段名。

注意:所有数据库查询返回的stdClass对象,必须通过->属性名的方式读取具体值,不能直接echo对象本身,否则会触发对象到字符串的类型错误。

内容的提问来源于stack exchange,提问作者abdallah al sawaqi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.23 16:36:03