2010-12-18 18 views
0

私はこれを理解できません。配列の配列を返す単純なクラスを作成しました。ここにクラスのコンストラクタがあります...アレイメンバーにアクセスできない

class BlogComments { 
public $commentArray=array(); 
public $blogId; 

function __construct($inId) { 
    if(!empty($inId)) { 
     $this->blogId=$inId; 
     $sql="select id,name,url,comment,email from blog_comment where blog_id=$inId"; 
     $link2=GetConnection(); 
     $query=mysql_query($sql,$link2) or die("Invalid blog id:".mysql_error()); 
     while($row=mysql_fetch_array($query)) { 
      $this->commentArray=array(
       "id"=>$row['id'], 
       "name"=>$row['name'], 
       "url"=>$row['url'], 
       "email"=>$row['email'], 
       "comment"=>$row['comment'] 
      ); 
     } 
     mysql_close($link2); 
    } 
} 
} 

私はループを介して配列の各メンバーにアクセスしようとしています。ループに入りますが、返される値は空です。データが配列に書き込まれていることを確認しました。ここに私のコードは...

include "include/commentclass.php"; 
$comments = new BlogComments($post->id); 
foreach($comments as $comment) { 
    echo "<h4>".$comment->commentArray['name']."</h4> 
     <a href=\"".$comment->commentArray['url']."\">".$comment->commentArray['url']."</a> 
     <p>".$comment->commentArray['comment']."</p>"; 
} 

基本的には空のタグを返します。また、$ post-> idが有効な値を保持していることも確認しました。私が間違っていることは何ですか?助けのための

おかげで、 B

+0

オブジェクト参照を反復処理することはできません。彼の答えでネットコーダーが言っているように、そうするためにTraversableを実装するべきです。あるいは、クラス内に$ commentArrayを与えるメソッドを実装するだけです。 – Andreas

答えて

0

はこれを試してみてください:

$comments = new BlogComments($post->id); 
foreach ($comments->commentArray as $comment) { 
    echo "<h4>".$comment['name']."</h4> 
     <a href=\"".$comment['url']."\">".$comment['url']."</a> 
     <p>".$comment['comment']."</p>"; 
} 

newキーワードは、単一のオブジェクトを返します。あなたのオブジェクト(BlogComments)がTraversableを実装していない限り、はcommentArrayおよびblogIdの公共のプロパティで動作し、commentArrayのコンテンツでは動作しません。

クラスにIteratorインターフェイスを実装させることもできます。

+0

あなたはどちらも正しいです。私は両方の答えを与えることができたらいいと思う。 – bflemi3

1

いくつかの間違いを犯しています。まず、netcoderが指摘しているのは、Iteratorインターフェイスを実装せずにオブジェクトを配列として使用していることです。 2番目は、結果配列を$this->commentArrayに直接代入していることです。次のように結果を配列に追加する必要があります。$this->commentArray[] = array(

+0

あなたはどちらも正しいです。あなたが述べたように配列に結果を追加する必要があり、ネットコーダーのコードを使用すると、両方を動作させることができました。両方のおかげで! – bflemi3

+0

+1 @Minkiele:いいです、私はそこに見つからなかった '[]'を見ていませんでした。 – netcoder

関連する問題