14

REQUEST 配列のキーと値を簡単に利用したいので、foreach ループを使用して REQUEST 配列を調べます。

SetCellValueただし、PHPExcel でスプレッドシートを作成していて、関数を使用したいので、ループが実行された回数の数値インデックスも必要です。私はこのようなことを考えています:

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

いいえ、組み込みのイテレータ数値インデックスはありません。ただし、この問題は他の方法で解決できます。

これを行う最も明白な方法は、単純な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 に答える
1

SPL イテレータ クラスを使用します。そのために活用できるものがあると確信しています。

于 2012-08-13T14:48:32.000 に答える
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 に答える