大きな問題ではありませんが、もっときれいな方法があるのではないかと思っていました。不要なifステートメントを使用してコードをネストしないようにすることをお勧めします。 $items
が空の場合、phpはエラーをスローします。
$items = array('a','b','c');
if(!empty($items)) { // <-Remove this if statement
foreach($items as $item) {
print $item;
}
}
おそらく「@」エラー抑制機能を使用することもできますが、それは少しハックです。
これを行う方法は数百通りあります。
最初の方法は、配列があると仮定して、foreachを使用して配列を実行することです。
他の場合、これはあなたが必要とするかもしれないものです:
foreach ((array) $items as $item) {
print $item;
}
注:タイプキャストについて不平を言うすべての人々に、OPが配列が空(強調は私のものです)。 true、false、数値、または文字列の値は空とは見なされませんです。さらに、これは\Traversable
を実装するオブジェクトで機能しますが、is_array
は機能しません。
最善の方法は、使用前にすべての流血の変数を初期化にすることです。
この愚かな「問題」を解決するだけでなく、realheadaches。
したがって、$ itemsを$items = array();
として導入することは、あなたが本当に望んでいたことです。
$items = array('a','b','c');
if(is_array($items)) {
foreach($items as $item) {
print $item;
}
}
警告出力を抑制することはお勧めしません。ただし、is_array
の代わりに!empty
を使用することをお勧めします。 $items
がゼロ以外のスカラーである場合、!empty
を使用すると、foreach
は引き続きエラーになります。
必要な変数がboolean false
の場合-たとえばデータベースからレコードが返されない場合またはarray
-レコードが返される場合、以下を実行できます。
foreach (($result ? $result : array()) as $item)
echo $item;
Cast((Array)$result
)を使用したアプローチでは、変数がboolean false
である場合にカウント1の配列が生成されますが、これはおそらく必要ではありません。
ここでの最善のアプローチは、$ itemsが常に配列になるようにコードを計画することだと思います。最も簡単な解決策は、コードの先頭で$ items = array()で初期化することです。この方法では、値を割り当てなくても空の配列を表します。
他のすべてのソリューションは、私にとって非常に汚いハックです。
foreach((array)$items as $item) {}
「標準ライブラリ」に次の関数があります
/// 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
三項論理により、エラーなしで1行になります。これにより、不適切にキャストされた変数と未定義の変数の問題が解決されます。
foreach (is_array($Items) || is_object($Items) ? $Items : array() as $Item) {
書くのは少し苦痛ですが、それを処理する最も安全な方法です。
ベストプラクティスは、コードの最上部で変数を配列として定義することです。
foreach((array)$ myArr as $ oneItem){..}
動作しますが、配列をループする必要があるたびにこの(配列)変換を複製します。
コードのWordさえも複製しないことが重要であるため、先頭の空の配列として定義する方が適切です。
$ itemsが実際に配列であるかどうか、およびアイテムが含まれているかどうかを確認できます。
if(is_array($items) && count($items) > 0)
{
foreach($items as $item) { }
}