【问题标题】:Manage SQL query multidimensional array output as stdClass Object将 SQL 查询多维数组输出作为 stdClass 对象管理
【发布时间】:2019-06-17 18:09:32
【问题描述】:

我在 PHP 5.6 上使用带有控制器和路由的 MVC 框架。

我正在尝试从数据库中定义一些 PHP 变量。

+---------+---------+-------------+---------------+
| meta_id | post_id |  meta_key   |  meta_value   |
+---------+---------+-------------+---------------+
|    3506 |     147 | event_flag  | 1             |
|    3507 |     147 | event_year  | 2019          |
|    3508 |     147 | event_title | Soccer Encore |
+---------+---------+-------------+---------------+

我在这里调用查询。

// Controller:
public function __construct()
    {

        parent::__construct();

        $this->_data['checklist_content'] = $this->_models['wp_stream_settings']->getChecklistMeta(147);
    }

这里是查询:

// Model:
function getChecklistMeta($item_id){ // passed $item_id = 147
     $sql = '
        SELECT *
        FROM '.PREFIX.'wp_postmeta
        where post_id = '.$item_id.' and meta_key IN ( "event_flag", "event_year", "event_title" );
    ';
    return $this->db->select($sql, array(':ID' => $item_id));
}

此查询将提供所需的所有信息并将变量放入 stdClass 对象中:

// Data
[checklist_content] => Array
    (
        [0] => stdClass Object
            (
                [meta_id] => 3506
                [post_id] => 147
                [meta_key] => event_flag
                [meta_value] => 1
            )

        [1] => stdClass Object
            (
                [meta_id] => 3507
                [post_id] => 147
                [meta_key] => event_year
                [meta_value] => 2019
            )

        [2] => stdClass Object
            (
                [meta_id] => 3508
                [post_id] => 147
                [meta_key] => event_title
                [meta_value] => Soccer Encore
            )
    )

但我无法按我的意愿管理数组:

echo $data['checklist_content']->{'event_title'};

我尝试使用 array_search:

print_r(array_search("event_title",$this->_data['checklist_content']));

无济于事。

我可以修改 SQL 查询以获得更易于管理的 stdClass 对象,或者以 JSON 格式重新映射它,或者其他。

我怎样才能修改查询,否则,为了得到这样的东西:

// Data
[checklist_content] => Array
    (
        [event_flag] => 1

        [event_year] => 2019

        [event_title] => Soccer Encore

    )

这样我就可以像这样轻松地显示值“Soccer Encore”:

echo $data['checklist_content']->{'event_title'};

现在我不得不得到这样的变量:

echo $data['checklist_content'][2]->{'meta_value'}; // Outputs "Soccer Encore"

我愿意重新设计查询,甚至使用 JSON 方法或序列化来更好地管理变量。

【问题讨论】:

  • 作为一般系统设计的建议,您应该将该表拆分为三个不同的表或将所有数据保存在一行中。将某个帖子的所有信息保存在一个多行表中的成本非常

标签: php sql arrays object stdclass


【解决方案1】:

对于 PHP >= 7.0.0 获取 meta_value 并通过 meta_key 对其进行索引:

$result = array_column($data['checklist_content'], 'meta_value', 'meta_key');

然后:

echo $result['event_title'];  //displays Soccer Encore

如果需要保留其他属性:

$result = array_column($data['checklist_content'], null, 'meta_key');

然后:

echo $result['event_title']['meta_value'];  //displays Soccer Encore

【讨论】:

  • 这正是我所寻找的,但适用于 PHP 5.6。我相应地更新了问题。
【解决方案2】:

接受的答案是正确的,但仅适用于 PHP70,对于 PHP56,我解决了使用 'for 循环' 从凌乱的数组中插入 meta_keymeta_value 对来创建附加数组的问题$this->_data['checklist_content']

// Data
[checklist_content] => Array
    (
        [0] => stdClass Object
            (
                [meta_id] => 3506
                [post_id] => 147
                [meta_key] => event_flag
                [meta_value] => 1
            )

        [1] => stdClass Object
            (
                [meta_id] => 3507
                [post_id] => 147
                [meta_key] => event_year
                [meta_value] => 2019
            )

        [2] => stdClass Object
            (
                [meta_id] => 3508
                [post_id] => 147
                [meta_key] => event_title
                [meta_value] => Soccer Encore
            )
    )

并将它们添加到新的 stdClass 数组中:$this->_data['campaign_settings']

<?php
// order stdClass data. parse data pairs (meta_key and and meta_value) 
// as new objects in the $this->_data['campaign_settings'] array
for ($i = 0; $i < count($this->_data['checklist_content']); $i++) {
    // create another array pair
    $nameKey = $this->_data['checklist_content'][$i]->{'meta_key'};
    $valueKey = $this->_data['checklist_content'][$i]->{'meta_value'};
    $this->_data['campaign_settings']->$nameKey = $valueKey;
}
?>

新数组显示如下:

Array
(
    [campaign_settings] => stdClass Object
        (
            [event_flag] => 1
            [event_year] => 2019
            [event_title] => Soccer Encore
        )
)

这些是此查询的所需输出:

echo $this->_data['campaign_settings']->{'event_title'}; // outputs "Soccer Encore"
echo $this->_data['campaign_settings']->{'event_year'}; // outputs "2019"
echo $this->_data['campaign_settings']->{'event_title'}; // outputs "1"

【讨论】:

    【解决方案3】:

    要将数据库的stdobject转换为json,请使用json_decode 它将对象转换为二维数组

    【讨论】:

    • json_decode 解码(不是编码)对象,json_encode 的结果不是“二维数组”,而是 JSON 字符串
    猜你喜欢
    • 1970-01-01
    • 2019-12-14
    • 2012-11-16
    • 1970-01-01
    • 2013-10-12
    • 2016-10-01
    • 2016-05-11
    • 2018-03-06
    • 2014-05-25
    相关资源
    最近更新 更多