我在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方法或序列化来更好地管理变量。
答案 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_key
和meta_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 它将对象转换为二维数组