преобразовать строку в объект в PHP (CodeIgniter) - PullRequest
0 голосов
/ 17 января 2012
Class Account extends CI_Model {
    private $tbl_rest   = array();
    private $tbl_fields = array('bs_id', 'bs_name', 'bs_type', 'bs_sub');

    function get_data($dataid){
        $this->db->select( '*' );
        $this->db->from( $this->tbl_name );
        $this->db->where( $this->tbl_key, $id );

        $query  = $this->db->get(); 
        if( $query->num_rows() > 0 ) 
        {
            foreach ($query->result() as $row)
            {
                $this->tbl_rest[] .= '<li id="'.$row->bs_id.'">'.$row->bs_name.'</li>';
            }

            echo( json_encode( array( 'tdata' => $this->tbl_rest ) ) );
        } else {
            echo( false );
        }
    }
}

Когда я изменяю $ query-> result () следующим образом

'<li id="'.$row->$this->tbl_fields[0].'">'.$row->$this->tbl_fields[1].'</li>';

Я начинаю получать ошибку "Объект класса не может быть преобразован в строку" Мой вопрос:

  1. Возможно ли преобразовать строку массива в объект?

  2. А как заставить $ row -> $ this-> tbl_fields [0] произойти, поэтому яне всегда нужно писать название поля.

Ответы [ 2 ]

0 голосов
/ 17 января 2012

Это базовый порядок операций.PHP не знает, хотите ли вы какое-нибудь динамическое свойство $this строки или свойство $this->tbl_fields[0] строки.

Попробуйте это:

<?php
 $this->tbl_rest[] .= '<li id="'.$row->{$this->tbl_fields[0]}.'">'.$row->{$this->tbl_fields[1]}.'</li>';

Кроме того, я бы хотелрекомендуем определять свойство модели $tbl_fields как статическое или постоянное, так как оно не изменяется во время выполнения или для конкретных экземпляров класса:

<?php
Class Account extends CI_Model {
    private static $tbl_fields = array('bs_id', 'bs_name', 'bs_type', 'bs_sub');
    // ...

    $this->tbl_rest[] .= '<li id="'.$row->{self::$tbl_fields[0]}.'">'.$row->{self::$tbl_fields[1]}.'</li>';

    // ...
}

Кроме того, жестко кодируемый массив ссылается на определенныеИмена столбцов несколько контрпродуктивны, если только вы не знаете, что [0] всегда будет идентификатором, а [1] всегда будет именем (в этом случае вы также можете установить статический префикс для имен столбцов и использовать еговместо массива $tbl_fields.

Еще лучше, потому что все, что вы здесь делаете, это пара ключ / значение (я предполагаю, что вы хотите повторно использовать этот шаблон для других методов API ...)Вы можете просто выбрать поля так, как вы хотите их использовать.Вот что я бы порекомендовал:

<?php
Class Account extends CI_Model {
    private $tbl_rest   = array();
    private static $col_prefix = 'bs_';

    function get_data($dataid){
        $this->db->select(array(
            self::$col_prefix.'id AS key',
            self::$col_prefix.'name AS value'
        ));
        $this->db->from( $this->tbl_name );
        $this->db->where( $this->tbl_key, $id );

        $query  = $this->db->get(); 
        if( $query->num_rows() > 0 ) 
        {
            foreach ($query->result() as $row)
            {
                $this->tbl_rest[] .= '<li id="'.$row->key.'">'.$row->value.'</li>';
            }

            echo( json_encode( array( 'tdata' => $this->tbl_rest ) ) );
        } else {
            echo( false );
        }
    }
}
0 голосов
/ 17 января 2012

Вы должны использовать поиск, прежде чем спрашивать

@ jlb

Вы можете создать стандартную переменную класса (очень простой объект):

$object = new stdClass();

и перебрать ваш массив и переназначить значения

foreach ($array as $key => $value)
{
    $object->$key = $value;
}

И поиск в гугле: http://www.richardcastera.com/blog/php-convert-array-to-object-with-stdclass

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...