【问题标题】:How do I fill an array inside a while loop and get new scope each iteration?如何在 while 循环中填充数组并在每次迭代时获取新范围?
【发布时间】:2012-07-28 11:45:12
【问题描述】:

问题是我只得到来自表的最后一个值。我认为这是因为我在将其值引用到同一个对象的同时构建数组,并且它不断变化。我知道 while 循环不会为每个 IS 问题的迭代创建一个新范围。

为每次迭代获取新范围的最佳方法是什么?

代码:

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


        } 
return $namesArray;

【问题讨论】:

    标签: php arrays loops while-loop


    【解决方案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";
    

    【讨论】:

      【解决方案2】:

      试试

      array_push(&$namesArray,$nameAndCode);
      

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

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

      $namesArray[] = $nameAndCode;
      

      【讨论】:

      • 避免在函数调用中使用'&'。使用 5.4 会遇到致命错误。
      • 很高兴知道。我也从未使用过array_push(),我依赖[]
      【解决方案3】:

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

      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']
          );
      } 
      

      【讨论】:

      • 数组推送有什么区别?
      • 你节省了调用函数的开销,这是array_push文档中的第一个注释:Note: If you use array_push() to add one element to the array it's better to use $array[] = because in that way there is no overhead of calling a function.
      猜你喜欢
      • 2018-08-25
      • 1970-01-01
      • 1970-01-01
      • 2021-05-30
      • 1970-01-01
      • 2020-11-09
      • 1970-01-01
      • 2013-11-03
      • 1970-01-01
      相关资源
      最近更新 更多