【问题标题】:Showing JSON data from database to view显示来自数据库的 JSON 数据以供查看
【发布时间】:2013-07-01 06:14:50
【问题描述】:

这是我在数据库中的表产品和类别的示例:

tbl_categories

 |id_category | name........| slug........|

 |1...........| Hanger .....| hanger .....|
 |2...........| Lamp .......| lamp .......|
 |3...........| Merchandise | merchandise |
 |4...........| Storage ....| storage ....|

tbl_products

id_products | id_category | name .....| slug .....| images

1 ..........| 1 ..........| Hanger asd| hanger-asd|json
2 ..........| 1 ..........| Hanger asd| hanger-dsa|json
3 ..........| 1 ..........| Hanger asd| hanger-das|json
4 ..........| 1 ..........| Hanger asd| hanger-sad|json

图像的内容是这样的 json_encoded:

id_product : 1

{
    "7b8d9fbfe384b1b6e4cfb0da473df8e5": {
        "alt": "jhonson hanger", 
        "caption": "", 
        "filename": "7b8d9fbfe384b1b6e4cfb0da473df8e5.jpg", 
        "primary": true
    }, 
    "f7d225c85590012f91bad32dd8adaa3d": {
        "alt": "jhonson hanger", 
        "caption": "lorem ipsum lorem ipsum dolor siamet ameticioud", 
        "filename": "f7d225c85590012f91bad32dd8adaa3d.jpg"
    }
}

等等

我想要的第一件事是让每个产品都显示在我的电子商务产品页面上,因此在我的控制器产品中:

function index()
{
    $data = array(
        "keyword" => "sadasdasd",
        "description" => "asdasdasd",
        "content" => "product",
        "title" => "BALOK Official :: Product"
    );
    $products = $this->model_product->get_all_products();
    $data['products'] = $products;

    $this->load->view("product", $data);
}

在我的模型产品中:

function get_all_products()
{
    $this->db->select
    ("
        tbl_product.name AS prod_name,
        images,
        tbl_product.slug AS prod_slug,
        tbl_categories.slug AS cat_slug
    ");
    $this->db->from("tbl_products");
    $this->db->join("tbl_categories", "tbl_categories.id_category = tbl_product.id_category");
    $this->db->order_by("prod_name", "ASC");
    $query = $this->db->get();

    if($query->num_rows() > 0)
    {
        return $query->result();
    }
    else
    {
        return false;
    }
}

如何为我认为的每个产品显示产品名称、prod_slug、cat_slug 和 只有一个 images['filename],如果 "primary = true" 则显示主要其他图像显示第一张图像。数组中的示例可能是images[0];

我已使用此代码检查了字段图像中的数据:

foreach ($products as $prod)
{
    $prod->images = json_decode($prod->images);
    print_r($prod->images);
}

这显示stdClass 对象如下:

stdClass Object
(
    [43f8cd2ba0fcb96453b43b36b6a4f759] => stdClass Object
    (
        [filename] => 43f8cd2ba0fcb96453b43b36b6a4f759.jpg
        [alt] =>
        [caption] =>
        [primary] => 1
    )
)
stdClass Object
(
    [f7d225c85590012f91bad32dd8adaa3d] => stdClass Object
        (
            [filename] => f7d225c85590012f91bad32dd8adaa3d.jpg
            [alt] => jhonson hanger
            [caption] => lorem ipsum lorem ipsum dolor siamet ameticioud
            [primary] => 1
        )
    [7b8d9fbfe384b1b6e4cfb0da473df8e5] => stdClass Object
    (
        [filename] => 7b8d9fbfe384b1b6e4cfb0da473df8e5.jpg
        [alt] => jhonson hanger
        [caption] =>
    )
)
stdClass Object
(
    [29c2100ff85ec538e17c6d68fafbd43d] => stdClass Object
        (
            [filename] => 29c2100ff85ec538e17c6d68fafbd43d.jpg
            [alt] =>
            [caption] =>
            [primary] => 1
        )
    [8d4ecb9c4dc369febe70019586f3d570] => stdClass Object
    (
        [filename] => 8d4ecb9c4dc369febe70019586f3d570.jpg
        [alt] =>
        [caption] =>
    )
    [dc4358c470c33f20206afc180a28ae5b] => stdClass Object
        (
            [filename] => dc4358c470c33f20206afc180a28ae5b.jpg
            [alt] =>
            [caption] =>
        )
)

那个stdobject让我很困惑。

更新。
鉴于我写这个:

foreach ($products as $prod)
{
  echo $prod->prod_name.' - '.$prod->prod_slug.' - '.$prod->cat_slug.'<br>';
}

它成功显示我想要的;

书柜木 - 书柜 - 木 - 存储
全新衣架 Jhonson - 全新衣架 - Jhonson - 衣架
Flash Wood - flash-wood - 商品
Gantungan baju dari kayu - gantungan-baju-dari-kayu - 衣架
萨满灯 - 萨满灯 - 灯
储物木架 - storage-wood-shelf - storage
木灯 - 木灯 - 灯
木灯超越 - 木灯超越 - 灯
Yoyo Kayu - boneka-kayu-lucu - 商品

图片还是json格式的,我不知道怎么操作,我只是想array_value,把json_data解码成数组后转换吧?

【问题讨论】:

  • 你的问题让我很困惑;)。对于stdObject,如果您解码json,您可以选择是将结果作为具有键和值的数组,还是作为具有属性的对象。 stdClass 只是一个 anonymous 对象。但你的实际问题是什么?
  • @t.niese 我的实际问题是我不知道如何只过滤每个产品的一个图像,然后显示它们。如果 json 上的主要 isset 然后显示主要.. :( 如果你知道我的意思,你能给我举个例子吗?
  • 只是为了确保我理解你的正确。对于某些产品,您的 JSON 中有多个图像,例如您的示例中的最后一个 stdClass。从那你只有一个拥有一个? (它总是第一个吗?)
  • 是的,你说得对.. 产品可以有多个图像,并且在此产品页面中,它显示数据库中的每个产品,并且始终显示第一个或如果“primary = true”则显示主图像.

标签: json codeigniter foreach


【解决方案1】:

如果您想要第一张图片或将primary设置为true的图片,您需要执行以下操作:

function getPrimaryImage($images) {
    //initialize the finalImage with 'null'
    $finalImage = null;

    //Iterate over all images
    foreach( $images as $image ) {

        //check if primary is set and if it is true
        if( isset($image->primary) && $image->primary ) {
            //if primary set the finalImage and exit the loop
            $finalImage = $image;
            break;
        } else if( $finalImage == null ) {
            //if primary is not set or false and the finalImage is not set, then set to the current image (first one)
            $finalImage = $image;
        }
    }

    return $finalImage;
}

foreach ($products as $prod)
{
    $prod->images = json_decode($prod->images);
    $prod->primaryImage = getPrimaryImage($prod->images);
}

编辑 我修改了上面的代码以显示文件名:

foreach ($products as $prod)
{
    $prod->images = json_decode($prod->images);
    $prod->primaryImage = getPrimaryImage($prod->images);
    echo $prod->prod_name.' - '.$prod->prod_slug.' - '.$prod->cat_slug.' '.$prod->primaryImage->filename.'<br>';
}

您遍历整个列表,将第一张图片设置为最终结果。如果您找到将primary 设置为true 的图像,则替换您的$finalImage 并退出循环。

你可以把它放在一个接受images作为参数并返回$finalImage作为结果的函数中。

【讨论】:

  • 嗯 json_decode 怎么样。我必须在哪里放置启动变量和循环中图像的 json_decode 函数?我在我的视图中用示例代码更新了上面的问题
  • 我更新了代码,但你真的应该自己多做一点。从我向您展示的代码中创建一个函数并将其添加到您的循环中应该不会那么复杂。 ;)
  • 天哪!我不知道怎么做,但我通过查看您的函数并使用 array_values 创建另一个函数来解决问题。你的功能让我大开眼界,非常感谢你的时间t.niese ..我感谢你的帮助,我欠你:D
  • 没问题,当你使用json_decode 时需要小心,默认情况下它返回一个stdObject(我认为在5.2 之前它默认返回数组),如果你不传递true 作为第二个参数。所以总是检查你是否得到一个数组或一个标准对象。
【解决方案2】:

您是否有令人信服的理由使用 JSON 数据?如果没有,只需创建一个名为 tbl_products_images 的新表并将其与之前的 JOIN 进行 JOIN。

【讨论】:

  • hmm 可能是因为我很容易在后端管理产品图像,如果图像被删除或更新,我需要做的只是将其发布到多个输入帖子 ['images'] 并更新图像场地。 :p
猜你喜欢
  • 1970-01-01
  • 2021-11-28
  • 2021-03-24
  • 2014-04-14
  • 1970-01-01
  • 1970-01-01
  • 2023-03-22
  • 1970-01-01
相关资源
最近更新 更多