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

那是因为您每次都将同一个对象推入数组。

您应该在每次迭代中推送一个新对象。例如,如果$o是一个stdClass对象,$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 被写入,这就是为什么它们看起来都具有相同的值:它们是相同的。

试试这个:

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 回答
0
$sql="select password, mail from account"; 
$result=mysql_query($sql);
$data = [];
while($row=mysql_fetch_assoc($result)){
array_push($data, ['password' => $row['password'],
           'mail' => $row['mail'],]);
}
header('Content-Type: application/json');
$encode_data = json_encode($data);
echo $encode_data;
于 2018-04-26T05:09:31.620 回答