PHP在Foreach循环中有一个“内置”迭代器吗?

时间:2012-08-13 14:36:01

标签: php foreach iterator phpexcel

我正在使用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这样的东西,然后每次循环运行时只增加它,但是有更清洁的东西吗?

7 个答案:

答案 0 :(得分:6)

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

答案 1 :(得分:5)

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

答案 2 :(得分:1)

使用SPL Iterator Class。我确信你可以利用这些东西。

答案 3 :(得分:1)

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

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

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

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

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

答案 4 :(得分:1)

使用For-Loop

你肯定可以使用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
// )

答案 5 :(得分:0)

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

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

答案 6 :(得分:0)

您可以获取$ _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);
}