web-dev-qa-db-ja.com

配列が空の場合にforeachをスキップする最もクリーンな方法

大きな問題ではありませんが、もっときれいな方法があるのではないかと思っていました。不要なifステートメントを使用してコードをネストしないようにすることをお勧めします。 $itemsが空の場合、phpはエラーをスローします。

$items = array('a','b','c');

if(!empty($items)) { // <-Remove this if statement
  foreach($items as $item) {
    print $item;
  }
}

おそらく「@」エラー抑制機能を使用することもできますが、それは少しハックです。

112
Keyo

これを行う方法は数百通りあります。

最初の方法は、配列があると仮定して、foreachを使用して配列を実行することです。

他の場合、これはあなたが必要とするかもしれないものです:

foreach ((array) $items as $item) {
    print $item;
}

注:タイプキャストについて不平を言うすべての人々に、OPが配列が(強調は私のものです)。 true、false、数値、または文字列の値は空とは見なされませんです。さらに、これは\Traversableを実装するオブジェクトで機能しますが、is_arrayは機能しません。

195
Christian

最善の方法は、使用前にすべての流血の変数を初期化にすることです。
この愚かな「問題」を解決するだけでなく、realheadaches。

したがって、$ itemsを$items = array();として導入することは、あなたが本当に望んでいたことです。

26
$items = array('a','b','c');

if(is_array($items)) {
  foreach($items as $item) {
    print $item;
  }
}
25
Matt Williamson

警告出力を抑制することはお勧めしません。ただし、is_arrayの代わりに!emptyを使用することをお勧めします。 $itemsがゼロ以外のスカラーである場合、!emptyを使用すると、foreachは引き続きエラーになります。

15
Zach Rattner

必要な変数がboolean falseの場合-たとえばデータベースからレコードが返されない場合またはarray-レコードが返される場合、以下を実行できます。

foreach (($result ? $result : array()) as $item)
    echo $item;

Cast((Array)$result)を使用したアプローチでは、変数がboolean falseである場合にカウント1の配列が生成されますが、これはおそらく必要ではありません。

9
Daniel Kmak

ここでの最善のアプローチは、$ itemsが常に配列になるようにコードを計画することだと思います。最も簡単な解決策は、コードの先頭で$ items = array()で初期化することです。この方法では、値を割り当てなくても空の配列を表します。

他のすべてのソリューションは、私にとって非常に汚いハックです。

6
foreach((array)$items as $item) {}
4
Milan

「標準ライブラリ」に次の関数があります

/// Convert argument to an array.
function a($a = null) {
    if(is_null($a))
        return array();
    if(is_array($a))
        return $a;
    if(is_object($a))
        return (array) $a;
    return $_ = func_get_args();
}

基本的に、これは配列/オブジェクトでは何もせず、他の型を配列に変換します。これは、foreachステートメントと配列関数で使用すると非常に便利です

  foreach(a($whatever) as $item)....

  $foo = array_map(a($array_or_string)....

  etc
3
user187291

三項論理により、エラーなしで1行になります。これにより、不適切にキャストされた変数と未定義の変数の問題が解決されます。

foreach (is_array($Items) || is_object($Items) ? $Items : array()  as $Item) {

書くのは少し苦痛ですが、それを処理する最も安全な方法です。

1
swirt

ベストプラクティスは、コードの最上部で変数を配列として定義することです。

foreach((array)$ myArr as $ oneItem){..}

動作しますが、配列をループする必要があるたびにこの(配列)変換を複製します。

コードのWordさえも複製しないことが重要であるため、先頭の空の配列として定義する方が適切です。

0
spetsnaz

$ itemsが実際に配列であるかどうか、およびアイテムが含まれているかどうかを確認できます。

if(is_array($items) && count($items) > 0)
{
    foreach($items as $item) { }
}
0
shasi kanth