Как заполнить массив внутри цикла while и получить новую область для каждой итерации?

Проблема в том, что я получаю только последнее значение, исходящее из таблицы. Я думаю, это потому, что я строю массив, ссылаясь на его значения на один и тот же объект, и он продолжает меняться. Я знаю, что while цикл не создает новую область для каждой итерации, которая является проблемой.

Каков наилучший способ получить новую область для каждой итерации?

Код:

$namesArray= array(); while ($row=mysql_fetch_array($result)) { $nameAndCode->code = $row['country_code2']; $nameAndCode->name = $row['country_name']; array_push($namesArray,$nameAndCode); } return $namesArray; 

Вам нужно создать новый объект на каждой итерации:

 while ($row=mysql_fetch_array($result)) { $nameAndCode = new stdClass; $nameAndCode->code = $row['country_code2']; $nameAndCode->name = $row['country_name']; $namesArray[] = $nameAndCode; } 

В противном случае вы снова и снова ссылаетесь на один и тот же объект и просто переписываете его значения.

Вы также можете сделать это с помощью массивов, если не требуете объектов:

 while ($row=mysql_fetch_array($result)) { $nameAndCode = array(); $nameAndCode['code'] = $row['country_code2']; $nameAndCode['name'] = $row['country_name']; $namesArray[] = $nameAndCode; } 

Или более кратко:

 while ($row=mysql_fetch_array($result)) { $namesArray[] = array( 'code' => $row['country_code2'], 'name' => $row['country_name'] ); } 

Я бы пошел с чем-то вроде:

 $namesArray=array(); while($row=mysql_fetch_array($result)){ $nameAndCode=array("code"=>$row["country_code2"], "name" => $row["country_name"]); array_push(&$namesArray,$nameAndCode); }; в $namesArray=array(); while($row=mysql_fetch_array($result)){ $nameAndCode=array("code"=>$row["country_code2"], "name" => $row["country_name"]); array_push(&$namesArray,$nameAndCode); }; 

Я бы также попробовал передать $namesArray по ссылке, как сказал Виктор. Мой код делает совершенно новый массив, чтобы продвигать каждую итерацию, что гарантирует, что вы не перезапишете материал. Кроме того, если вы хотите добавить материал в массив, обратившись к нему через свой индекс, вы должны использовать это:

 // This is the right way $someArray["foo"]="bar"; $someArray["baz"]="quux"; // This is wrong, it's only for OOP $someArray->foo="bar"; $someArray->baz="quux"; 

Пытаться

 array_push(&$namesArray,$nameAndCode); 

Я думаю, что array_push требует ссылки или указателя.

Есть ли причина, по которой вы не используете $namesArray[] ? Вместо вышесказанного:

 $namesArray[] = $nameAndCode;