对象提取属性

时间:2011-09-15 15:29:47

标签: php arrays object extraction

我有一个对象:

object(stdClass)#27 (1)
{
    [0] => object(stdClass)#26 (6)
    {
        ["_id"] => object(MongoId)#24 (1)
        {
            ["$id"] => string(24) "4e6ea439caa47c2c0c000000" 
        }
        ["username"] => string(16) "wdfkewkghbrjkghb"
        ["email"]=> string(24) "wdhbfjkwhegerg@€rg.efg"
        ["password"]=> string(32) "4297f44b13955235245b2497399d7a93"
        ["slug"]=> string(16) "wdfkewkghbrjkghb"
        ["insert_datetime"]=> string(19) "2011-09-13 12:09:49" 
    } 

} 

我将此对象分配给$user

我无法访问此对象属性,使用$ user-> username因为我收到了消息:

  

未定义的属性:stdClass::$username

然后,如果我var_dump(get_object_vars($user)),则返回一个空数组。

如何获取属性?如果可以避免,我不想使用循环。


过程是这样的:

  1. 从mongo_db检索结果:

    $returns = array();
    
    while ($documents->hasNext())
    {
        if ($this->CI->config->item('mongo_return') == 'object')
        {
            $returns[] = (object) $documents->getNext();    
        }
    
        if ($this->CI->config->item('mongo_return') == 'array')
        {
            $returns[] = (array) $documents->getNext();
        }
    }
    
    if ($this->CI->config->item('mongo_return') == 'object')
    {
        return (object)$returns;
    }
    
    
    if ($this->CI->config->item('mongo_return') == 'array')
    {
        return $returns;
    }
    
  2. 将数据传递给模型

    function populateBy($what = false) {
        return $this->mongo_db
                    ->where($what)
                    ->get($this->tb['users']);
    }
    
  3. 肯定会在控制器中获取结果:

    $what = array(
        'email'=>$email,
        'password'=>$password,
        'confirm'=>'1'
    );
    
    $user  = $this->model_user->populateBy($what);
    

2 个答案:

答案 0 :(得分:2)

您的username财产不是您正在寻找的地方。尝试

$username = $user[0]->username;

编辑尝试此操作会给我一些意想不到的结果。我得到"Cannot use object of type stdClass as array"所以我认为你应该做的是使用foreach循环

// $users is the object in this sample
foreach($users as $user)
{
    $username = $user->username;
}

编辑2 您可以使用get_object_vars

$users = get_object_vars($users);
$username = $users[0]->username;

答案 1 :(得分:2)

正如吉尔登所说,您正在寻找的属性是子对象的属性。但是,他错过了对象属性访问与数组元素访问不同。

您在这里遇到的真正问题是您已将数组转换为对象,现在您拥有了一个数字属性名称。要获取属性,您必须使用$user->0->username之类的语法,但显然这是无效的,因为0不是有效的变量名。

来自the documentation

  

如果将对象转换为数组,则结果是一个数组   元素是对象的属性。键是成员变量   名称,有一些值得注意的例外:整数属性   无法访问 [原文如此] ;私有变量具有前缀的类名   变量名;受保护的变量前面有一个'*'   变量名。这些前置值在任一侧都有空字节。   这可能会导致一些意外行为:

函数get_object_vars再次转换回一个数组,以便出现才能工作,但实际上任何事情都可能发生:行为未指定,因为对象元素在其中无法访问中间阶段。同样,$user->{'0'}->username可能适合您,但我会避免它。

不幸的是,这意味着您必须更改代码的工作方式:不要将数字索引数组转换为对象。