14

我正在使用 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);
}

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

4

7 回答 7

7

PHP 的 foreach 没有内置此功能(根据手册)。使用for 循环来拥有一个迭代器或自己实现它。

于 2012-08-13T14:39:51.803 回答
5

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

于 2012-08-13T14:39:10.950 回答
1

使用SPL 迭代器类。我敢肯定那里有一些东西可以用来做这件事。

于 2012-08-13T14:48:32.000 回答
1

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

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

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

您还可以使用foreach计数器变量:

$i = 0;
foreach ($foo as $key => $value) {
    // ...
    ++$i;
}
于 2012-08-13T15:22:11.540 回答
1

使用 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
// )
于 2013-07-28T18:29:13.437 回答
0

您的问题也在这里得到解答:如何在不使用“计数器”变量的情况下找出 PHP 中 foreach 构造循环的次数?

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

于 2012-08-13T14:45:40.730 回答
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);
}
于 2014-05-12T15:06:01.760 回答