4

多くのオブジェクトを配列にプッシュしたい

そして、各オブジェクトは異なる値を持っています

しかし、それらを配列にプッシュしたとき

それらのすべての値は同じです

この問題を解決するには?

$sql="select password, mail from account";
$result=mysql_query($sql);
$arr=array();
while($row=mysql_fetch_assoc($result))
{
    $o->pw=$row['password'];
    $o->mail=$row['mail'];
    array_push($arr, $o);
}
echo json_encode($arr);
4

6 に答える 6

9

これは、毎回同じオブジェクトを配列にプッシュしているためです。

代わりに、反復ごとに新しいオブジェクトをプッシュする必要があります。たとえば、$ostdClassオブジェクトの場合$o = new stdClass、ループ内で使用します。

while($row=mysql_fetch_assoc($result))
{
    $o = new stdClass;
    $o->pw=$row['password'];
    $o->mail=$row['mail'];
    array_push($arr, $o);
}

を使用することもできますがmysql_fetch_object、これはおそらくより適切です。

while($o=mysql_fetch_object($result))
{
    array_push($arr, $o);
}

上記のオブジェクトのプロパティは、SQL クエリ列に基づいて名前が付けられるため、同じ効果を得るには、クエリを に変更する必要もありますselect password AS pw, mail from account

最後に、オブジェクトを毎回クローンするという別のオプションもありますが、ほとんどの場合、他の方法が推奨されます。

while($row=mysql_fetch_assoc($result))
{
    $o = clone $o;
    $o->pw=$row['password'];
    $o->mail=$row['mail'];
    array_push($arr, $o);
}
于 2012-05-01T19:04:00.357 に答える
4

最初に $o を宣言してみてください (while ループ内):

$o = new stdClass;
于 2012-05-01T19:02:37.440 に答える
3

これは、オブジェクトが参照として配列に追加されているためです。配列内の各要素は、同じオブジェクトであるオブジェクトへの参照です。

を宣言していない$oので、最初に を実行する$o->pwと、PHP によってオブジェクトが作成されます。これを行うと、ループのスコープ外に作成されるため、ループの各反復は同じ を参照します$o

$o各ループ反復を宣言する必要があります。

while($row=mysql_fetch_assoc($result))
{
    $o = new stdClass;
    $o->pw = $row['password'];
    $o->mail = $row['mail'];
    array_push($arr, $o);
}
于 2012-05-01T19:06:15.973 に答える
1

php で push をあまり使用する必要はありません。空の括弧を使用して追加できます。違いがあるかどうかはわかりませんが、ブラケットの方が簡単だと思います。また、このコードでは O が定義されていないようで、ループ内でリセットされていないようです。あなたの質問全体についてはあまり明確ではありませんが、それがおそらく問題の原因です。幸運を

$sql="select password, mail from account";
$result=mysql_query($sql);
$arr=array();
while($row=mysql_fetch_assoc($result))
{
    //define/reset o here
    $o->pw=$row['password'];
    $o->mail=$row['mail'];
    $arr[] = $o;
}
echo json_encode($arr);
于 2012-05-01T19:05:24.287 に答える
1

ループの反復ごとに新しいオブジェクトをインスタンス化する必要があると思います。現在、ループの反復ごとに書き込まれる $o は 1 つだけです。そのため、それらはすべて同じ値を持っているように見えます: それらは同じです。

これを試して:

while($row=mysql_fetch_assoc($result))
{
    $o = new stdClass();
    $o->pw=$row['password'];
    $o->mail=$row['mail'];
    array_push($arr, $o);
}
于 2012-05-01T19:08:50.203 に答える