将SQL查询多维数组输出作为stdClass对象进行管理

时间:2019-06-17 18:09:32

标签: php sql arrays object stdclass

我在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方法或序列化来更好地管理变量。

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

可接受的答案是正确的,但仅适用于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"

答案 2 :(得分:-1)

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