2011-09-15 12 views
0

私はこのようなオブジェクトを持っている:オブジェクトの抽出プロパティ

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) "[email protected]€rg.efg" 
     ["password"]=> string(32) "4297f44b13955235245b2497399d7a93" 
     ["slug"]=> string(16) "wdfkewkghbrjkghb" 
     ["insert_datetime"]=> string(19) "2011-09-13 12:09:49" 
    } 

} 

Iは$userにこのオブジェクトを割り当てます。私がする$ user->ユーザ名の原因をやって、このオブジェクトのプロパティにアクセスを得ることができません

私はメッセージが表示されます。私はvar_dump(get_object_vars($user))をすれば

Undefined property: stdClass::$username

は、その後、それは空の配列を返します。

プロパティを取得するにはどうすればよいですか?私がそれを避けることができれば、私はループを使いたくない。


プロセスはこれです:間違いcontrolleで結果を取得

function populateBy($what = false) { 
    return $this->mongo_db 
       ->where($what) 
       ->get($this->tb['users']); 
} 
  • をモデル化するために、データを渡す

    $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; 
    } 
    
    1. はmongo_dbから結果を取得しますR:

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

    私に文脈を教えてください。私はあなたの質問に答えることができると思うが、私はあなたの思考プロセスを最初に見たいと思う。 – TFennis

    +0

    @gilden:それは正しい答えだった。なぜあなたはそれを削除しましたか? –

    +1

    @ tomalak-geretkal私はいくつかの調査をしましたが、それが正しいかどうかはわかりません。 – gilden

    答えて

    2

    を使用することができます取得しますサブオブジェクトのプロパティ。しかし、彼は、オブジェクトのプロパティのアクセスが配列要素のアクセスと同じではないことを忘れていました。

    本当の問題は、配列をオブジェクトに変換し、数値プロパティ名を持つことです。プロパティにアクセスするには、$user->0->usernameのような構文を使用する必要がありますが、0は有効な変数名ではないため、これは無効です。

    the documentationから:オブジェクト要素がアクセス不能にレンダリングされたため、動作は不定です:それは仕事にを見えますが、実際には何が起こることができるように機能get_object_varsは再び配列に変換し

    If an object is converted to an array, the result is an array whose elements are the object's properties. The keys are the member variable names, with a few notable exceptions: integer properties are unaccessible[sic]; private variables have the class name prepended to the variable name; protected variables have a '*' prepended to the variable name. These prepended values have null bytes on either side. This can result in some unexpected behaviour:

    中間段階で。同様に、$user->{'0'}->usernameはあなたのために働くかもしれませんが、私はそれを避けるでしょう。

    残念ながら、コードの動作方法を変更する必要があります。すなわち、数値インデックス配列をオブジェクトに変換しないでください。

    2

    あなたusernameプロパティは、あなたがそれを探しているところではありません。これは私にいくつかの予期しない結果を与えるしようと

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

    EDITを試してみてください。私は、あなたが探しているプロパティがあり、gildenが言うように"Cannot use object of type stdClass as array"ので、私はあなたがforeachループを使用しているやるべきだと思うものを

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

    EDIT 2あなたはget_object_vars

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

    私の質問をチェックするこの行には: "可能であれば、ループを使用したくない、thx":P – sbaaaang

    +1

    @Ispuk: "loops" –

    +0

    またはそれ以上のループを入れてモデル関数populateBy (){}を呼び出し、コントローラーでコントローラを循環させずに$ user-> usernameを実行するのに便利なオブジェクトをコントローラに返します。P – sbaaaang

    関連する問題