Управление выводом многомерного массива SQL-запросов в виде объекта stdClass - PullRequest
0 голосов
/ 17 июня 2019

Я использую инфраструктуру MVC с контроллерами и маршрутами на PHP 5.6.

Я пытаюсь определить некоторые переменные 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 ]

1 голос
/ 17 июня 2019

Для 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
0 голосов
/ 24 июня 2019

Принятый ответ правильный, но работает только для PHP70, для PHP56 Я решил проблему, создав дополнительный массив, используя 'for loop' вставляя пары 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"
0 голосов
/ 17 июня 2019

Для преобразования стандартного объекта базы данных в json используйте json_decode. Он конвертирует объект в массив 2D

.
...