【问题标题】:Does PHP Have a "built-in" iterator in a Foreach loop?PHP 在 Foreach 循环中是否有“内置”迭代器?
【发布时间】:2012-08-13 14:36:01
【问题描述】:

我正在使用 foreach 循环遍历 REQUEST 数组,因为我希望有一种简单的方法来利用 REQUEST 数组的键和值。

但是,我还想要一个循环运行次数的数字索引,因为我正在使用 PHPExcel 编写电子表格,并且我想使用 SetCellValue 函数。我在想这样的事情:

foreach( $_REQUEST as $key => $value){
    $prettyKeys = ucwords(preg_replace($patt_underscore," ",preg_replace($patt_CC,"_",$key)));
    $prettyVals = ucwords(preg_replace($patt_underscore," ",preg_replace($patt_CC,"_",$value)));
    // Replace CamelCase with Underscores, then replace the underscores with spaces and then capitalize string
    // "example_badUsageOfWhatever" ==> "Example Bad Usage Of Whatever"


    $myExcelSheet->getActiveSheet()->SetCellValue( "A". $built-in-foreach-loop-numerical-index ,$prettyKeys);
    $myExcelSheet->getActiveSheet()->SetCellValue( "B". $built-in-foreach-loop-numerical-index ,$prettyVals);
}

我知道我可以很容易地在 foreach 外部实现类似 $c = 0 的东西,然后每次运行循环时递增它,但是有什么更干净的东西吗?

【问题讨论】:

  • 一句话,没有。与几乎任何语言一样,如果你想要一个计数器,你必须自己实现它。
  • 如果您需要此功能,请使用 for 循环。

标签: php foreach iterator phpexcel


【解决方案1】:

PHP 的 foreach 没有内置此功能 (per the manual)。使用for loop 拥有一个迭代器或自己实现它。

【讨论】:

    【解决方案2】:

    for 循环将为您提供自动计数器,但无法循环通过您的 $_REQUEST 关联数组。 foreach 循环将让您循环通过,但没有内置计数器。这是一个权衡,但至少它是一个非常易于管理的(只需要 2 行代码来构建计数器)!

    【讨论】:

      【解决方案3】:

      使用SPL Iterator Class。我确定你可以利用其中的一些东西。

      【讨论】:

      • 你知道学习如何使用这些的好资源吗?我从未见过 PHP 的这一方面。
      • 我从来没有找到过,我用过IteratorIterator、LimitIterator,只需要自己弄清楚。去 Google 疯狂吧,我确定它就在那里
      【解决方案4】:

      不,没有内置的迭代器数字索引。不过,您可以通过其他方式解决此问题。

      最明显的方法是使用简单的for 循环:

      for ($i = 0, $numFoo = count($foo); $i < $numFoo; ++$i) {
          // ...
      }
      

      您还可以将foreach 与计数器变量一起使用:

      $i = 0;
      foreach ($foo as $key => $value) {
          // ...
          ++$i;
      }
      

      【讨论】:

        【解决方案5】:

        使用 For 循环

        你绝对可以用 for 循环来做到这一点,只是有点难看:

        reset($array);
        for ($i=0; $i<count($array); $i++) {
            // $i is your counter
            // Extract current key and value
            list($key, $value) = array(key($array), current($array));
        
            // ...body of the loop...
        
            // Move to the next array element
            next($array);
        }
        

        扩展 ArrayIterator

        我的首选方式是扩展ArrayIterator。添加一个内部计数器,然后覆盖 next() 和 rewind() 以更新计数器。计数器给出当前数组元素从 0 开始的键:

        class MyArrayIterator extends ArrayIterator
        {
            private $numericKey = 0;
        
            public function getNumericKey()
            {
                return $this->numericKey;
            }
        
            public function next()
            {
                $this->numericKey++;
                parent::next();
            }
        
            public function rewind()
            {
                $this->numericKey = 0;
                parent::rewind();
            }
        }
        
        // Example:
        $it = new MyArrayIterator(array(
            'string key' =>'string value',
            1 =>'Numeric key value',
        ));
        echo '<pre>';
        foreach ($it as $key =>$value) {
            print_r(array(
                'numericKey' =>$it->getNumericKey(),
                'key' =>$key,
                'value' =>$value,
            ));
        }
        
        // Output:
        // Array
        // (
        //     [numericKey] => 0
        //     [key] => string key
        //     [value] => string value
        // )
        // Array
        // (
        //     [numericKey] => 1
        //     [key] => 1
        //     [value] => Numeric key value
        // )
        

        【讨论】:

          【解决方案6】:

          您的问题也在这里得到解答:How can I find out how many times a foreach construct loops in PHP, without using a "counter" variable?

          很快,不。没有更简单的方法了。

          【讨论】:

            【解决方案7】:

            可以得到$_REQUEST数组的每个键的索引:

            $req_index= array_flip (array_keys($_REQUEST));

            现在您通过$req_index[$key] 获得了当前元素的数字索引,它还给出了循环的迭代次数:

            foreach($_REQUEST as $key => $value){
                $prettyKeys = ucwords(preg_replace($patt_underscore," ",preg_replace($patt_CC,"_",$key)));
                $prettyVals = ucwords(preg_replace($patt_underscore," ",preg_replace($patt_CC,"_",$value)));
                // Replace CamelCase with Underscores, then replace the underscores with spaces and then capitalize string
                // "example_badUsageOfWhatever" ==> "Example Bad Usage Of Whatever"
            
                //THE NUMERICAL INDEX IS $req_index[$key]
                $myExcelSheet->getActiveSheet()->SetCellValue( "A". $req_index[$key], $prettyKeys);
                $myExcelSheet->getActiveSheet()->SetCellValue( "B". $req_index[$key], $prettyVals);
            }
            

            【讨论】:

              猜你喜欢
              • 2013-03-23
              • 2012-11-10
              • 1970-01-01
              • 1970-01-01
              • 2013-11-19
              • 1970-01-01
              • 2017-01-15
              • 1970-01-01
              • 2015-03-09
              相关资源
              最近更新 更多