49

おそらく意味をなさない理論的な質問ですが、それでも、賢い答えがあるかもしれません。

配列を反復処理して、そのキーを取得し、それらを使用して何かを取得したいと考えています。私がしていることの簡単な例:

foreach($array as $key => $value) {
    $other_array[$key] = 'something';
}

さて、このスコープで使われていないPHP Mess Detector悲鳴。$valueしたがって、おそらくこれはkeys私のにアクセスする最良の方法ではないと考えていましたarray

values私のから不必要に取り出さずにそれを行う方法はありarrayますか?それはパフォーマンスに重大な影響を与えますか...またはおそらく私は妄想的であり、愚かな質問で誰の時間を無駄にすることなく続行する必要があります:)。

4

7 に答える 7

80

あなたはこのようなことをすることができます

foreach(array_keys($array) as $key) {
 // do your stuff
}

これにより、実際の配列ではなく、配列のキーで構成される配列に対してforeachが反復処理されます。ただし、パフォーマンスの観点からはおそらく良くないことに注意してください。

于 2012-09-10T07:17:26.217 に答える
17

このメッセージは無視してください。

PHPでは、使用した方法がforeach最速です。未使用の変数を避けるべきなのは当然ですが、この場合、パフォーマンスをいくらか失うことなく避けることはできません。

たとえば、 よりもforeach(array_keys($arr) as $key)約 50% から 60% 遅く
なりforeach($arr as $key => $notUsed)ます。

phpmd のこの問題は既にここで報告されており、プル リクエストもここにあります。

phpmd が更新されるまで、この小さなハックも使用できます

/src/main/php/PHPMD/Rule/UnusedLocalVariable.phpメソッド内のファイルcollectVariables(..)(私の場合は123行目)で置き換えます

if ($this->isLocal($variable))

if ($this->isLocal($variable) && !($this->isChildOf($variable, 'ForeachStatement') && $variable->getName() === '$notUsed'))

これにより、phpmd がforeach ループ内のレポートを停止し$notUsed ます。

更新: 上記の推奨事項は、PHP 5.6 (この回答を書いている時点での関連バージョン) を想定しています。しかし、時が経ち、PHP 7.2 を使用するようになった今では逆になっているようです。いつものように正確なユース ケースに依存しますが、キーが 100.000 未満の連想配列の場合はarray_keys($arr)、変数に格納し、これを foreach ループで使用する方が高速です。

于 2014-10-09T15:39:11.250 に答える
1

すべてのキーを特定の値に設定したい場合は、次の方法で実行できます。

$array = array(
        'foo'=> 'oldval1',
        'bar'=> 'oldval2',
        'baz'=> 'oldval3'
);

$other_array = array_fill_keys(array_keys($array), 'something');
print_r($other_array);

これにより、次が生成されます。

Array
(
    [foo] => something
    [bar] => something
    [baz] => something
)
于 2012-09-10T07:26:18.033 に答える