我正在使用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
这样的东西,然后每次循环运行时只增加它,但是有更清洁的东西吗?
答案 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循环执行此操作,它只是有点难看:
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。添加内部计数器,然后覆盖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);
}