Проблема в том, что я получаю только последнее значение, исходящее из таблицы. Я думаю, это потому, что я строю массив, ссылаясь на его значения на один и тот же объект, и он продолжает меняться. Я знаю, что 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;