1

问题是我只得到来自表的最后一个值。我认为这是因为我在将其值引用到同一个对象的同时构建数组,并且它不断变化。我知道 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;
4

3 回答 3

11

您需要在每次迭代时创建一个新对象:

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']
    );
} 
于 2012-07-30T18:54:47.630 回答
1

我会选择类似的东西:

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

我也会尝试通过$namesArray引用传递,就像 Viktor 提到的那样。我的代码创建了全新的数组来推动每次迭代,这确保你不会覆盖任何东西。此外,如果您想通过索引访问数组来将内容添加到数组中,您应该使用以下命令:

// 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";
于 2012-07-30T19:03:09.617 回答
0

尝试

array_push(&$namesArray,$nameAndCode);

我认为array_push需要一个引用或指针。

你不使用有什么原因$namesArray[]吗?而不是上面的:

$namesArray[] = $nameAndCode;
于 2012-07-30T18:55:05.790 回答