PHP正在用最后一项的副本填充json

PHP正在用最后一项的副本填充json,php,json,Php,Json,我正在使用php开发一个web应用程序。我试图从数据库中提取并用信息填充数组,然后将其编码为json 以下是我到目前为止的情况: $result = mysqli_query($db, $query); $row = mysqli_fetch_array($result); $frats = array(); while ($row = mysqli_fetch_array($result)) { $frat->name = $row['name']; $frat->

我正在使用php开发一个web应用程序。我试图从数据库中提取并用信息填充数组,然后将其编码为json

以下是我到目前为止的情况:

$result = mysqli_query($db, $query);
$row = mysqli_fetch_array($result);

$frats = array();
while ($row = mysqli_fetch_array($result)) {
    $frat->name = $row['name'];
    $frat->description = $row['description'];
    $frat->chapter = $row['chapter'];
    $frat->members = $row['members'];
    $frat->cover_image = $row['cover_image'];
    $frat->profile_image = $row['profile_image'];
    $frat->calendar_image = $row['calendar_image'];
    $frat->preview_image = $row['preview_image'];
    $frat->address = $row['address'];
    $frats[] = $frat;
}

echo json_encode($frats);
作为回报,我得到的是正确的json格式,包括正确的键和所有内容,但json中的每一项都是相同的。他们都是最后一个。我相信这是因为我可能只是引用了这些值,但我不确定如何在php中真正复制它们


有什么建议吗?

您需要在循环中创建一个新的
$frat
实例。否则,每次循环运行时,您只需更新原始的
$frat
,并在数组中添加对它的引用

假设它不是一个静态类,您可以使用:

$frats = array();
while ($row = mysqli_fetch_array($result)) {
    $frat = new frat();
    $frat->name = $row['name'];
    $frat->description = $row['description'];
    $frat->chapter = $row['chapter'];
    $frat->members = $row['members'];
    $frat->cover_image = $row['cover_image'];
    $frat->profile_image = $row['profile_image'];
    $frat->calendar_image = $row['calendar_image'];
    $frat->preview_image = $row['preview_image'];
    $frat->address = $row['address'];
    $frats[] = $frat;
}

echo json_encode($frats);
更好的做法是修改构造函数或创建一个方法来使用数据。如果使用类的构造函数,则可以执行以下操作:

$frats = array();
while ($row = mysqli_fetch_array($result)) {
    $frats[] &= new frat($row['name'], $row['description'], $row['chapter']);
}

echo json_encode($frats);

您需要在循环中创建一个新的
$frat
实例。否则,每次循环运行时,您只需更新原始的
$frat
,并在数组中添加对它的引用

假设它不是一个静态类,您可以使用:

$frats = array();
while ($row = mysqli_fetch_array($result)) {
    $frat = new frat();
    $frat->name = $row['name'];
    $frat->description = $row['description'];
    $frat->chapter = $row['chapter'];
    $frat->members = $row['members'];
    $frat->cover_image = $row['cover_image'];
    $frat->profile_image = $row['profile_image'];
    $frat->calendar_image = $row['calendar_image'];
    $frat->preview_image = $row['preview_image'];
    $frat->address = $row['address'];
    $frats[] = $frat;
}

echo json_encode($frats);
更好的做法是修改构造函数或创建一个方法来使用数据。如果使用类的构造函数,则可以执行以下操作:

$frats = array();
while ($row = mysqli_fetch_array($result)) {
    $frats[] &= new frat($row['name'], $row['description'], $row['chapter']);
}

echo json_encode($frats);

您需要正确声明变量$frat(数组)和$frat(对象):


您需要正确声明变量$frat(数组)和$frat(对象):


while
循环的第一行中,您只需要以下行:

$frat = new \stdClass();

while
循环的第一行中,您只需要以下行:

$frat = new \stdClass();

您需要在循环中为一个新的frat加上标记,$frat究竟在哪里初始化和设置?你有那个代码吗?你需要在循环中为一个新的frat加上标记,$frat在哪里被初始化和设置?你有那个代码吗?(如果$frat一开始不是stdClass对象,那可能会是灾难性的……但问题是$frat从何而来还不清楚)@Randall yep,没有迹象表明$frat以前是什么,谁知道呢(如果$frat一开始不是stdClass对象,可能会是灾难性的……但问题不清楚$frat从何而来)@Randall yep,没有迹象表明$frat以前是否存在,谁知道呢