当在php中将对象推送到数组时,所有对象都是相同的

时间:2012-05-01 18:59:38

标签: php arrays json object

我想将许多对象推入数组

并且每个对象具有不同的值

但是当我把它们推入数组时

它们的所有值都相同

如何解决这个问题?

$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);

6 个答案:

答案 0 :(得分:8)

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

您应该在每次迭代中推送一个新对象。例如,如果$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

最后,另一种选择是每次clone对象 - 尽管其他选择几乎总是更可取:

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

答案 1 :(得分:4)

首先尝试声明$ o(在while循环中):

$o = new stdClass;

答案 2 :(得分: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);
}

答案 3 :(得分: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);

答案 4 :(得分:1)

我认为你需要为循环的每次迭代实例化一个新对象。现在只有一个$ o被写入循环的每次迭代,这就是为什么它们看起来都具有相同的值:它们是相同的。

试试这个:

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

答案 5 :(得分: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;