すべての配列項目が空のPHPであるかどうかの確認


83

フォームからアイテムの配列を追加していますが、すべてが空の場合は、検証を実行してエラー文字列に追加します。ので、私は持っています:

$array = array(
    'RequestID'       => $_POST["RequestID"],
    'ClientName'      => $_POST["ClientName"],
    'Username'        => $_POST["Username"],
    'RequestAssignee' => $_POST["RequestAssignee"],
    'Status'          => $_POST["Status"],
    'Priority'        => $_POST["Priority"]
);

そして、すべての配列要素が空の場合は、次のように実行します。

$error_str .= '<li>Please enter a value into at least one of the fields regarding the request you are searching for.</li>';

5
これを読んで混乱している人には、$ _POSTを一重引用符で囲まないでください。評価されません。
ジェイミー

2
私は引用を編集する自由を奪いました。
xtofl 2018

回答:


177

組み込みのarray_filterを使用できます

コールバックが指定されていない場合、FALSEに等しい入力のすべてのエントリ(ブール値への変換を参照)が削除されます。

したがって、これを1行で実行できます。

if(!array_filter($array)) {
    echo '<li>Please enter a value into at least one of the fields regarding the request you are searching for.</li>';
}

1
これが私が提案した内破法よりも速いかどうか知りたいです。周りにベンチマークはありますか?
カプセル

array_filter()@ dogmatic69によってすでに言及されました。パフォーマンスについて-私はシンプルは信じforeach速く両方よりべきであるarray_filter()implode()
binaryLV 2011

これは、組み込み関数phpbench.comのphpベンチマークの素晴らしい光景ですが、おそらく配列のサイズに依存します。配列が大きいほど、この方法は高速になります。
xzyfer 2011

1
@xzyferは、if(implode($array)) echo '..'1つの配列要素が(string)"0"。であっても、「..」を出力します。foreach遅いことについてarray_filter()-よろしいですか?配列要素を1つずつ削除する方が、配列要素を読み取るよりもどのように高速ですか?
binaryLV 2011

2
@xzyfer、私はいくつかのテストを行いました-array_filter()値が入力されているかどうかを確認するためだけに使用すると、結果を格納するためのブール変数と最初の無効な値を使用した基本ループよりも少なくとも数倍遅くなります。でもで「ネイティブPHP関数」であること、それは実際よりも速くすることはできません、それは新しい配列変数を作成する必要がありますよう。foreachbreakarray_filter()foreach
binaryLV 2011

22

空の接着剤で配列を内破し、結果の文字列のサイズを確認します。

<?php if (strlen(implode($array)) == 0) echo 'all values of $array are empty'; ?>

strlenこれをより効率的にするために、あなたは呼び出しを削除することができます。if(implode($array)) echo '..'
xzyfer 2011

@binaryLV、どうやって?彼らは両方とも問題を解決できないことに同意した。しかし、それらは同等ではありませんか?
xzyfer 2011

1
@xzyferは、場合$str(string)'0'、その後strlen($str) == 0に評価falseしながら、!$strevaulatesにするtrueためstrlen($str) == 0に置き換えることができません!$str
binaryLV 2011

このソリューションは、配列をフィルタリングするためにコールバックで使用することを目的としているarray_filterため、を使用するよりも正しいと感じarray_filterます。しかし、あなたがしたいのは「空」をチェックすることだけです。だからあなたはそれの文字列を作り、その長さをチェックします。鮮やかさ。
kasimir 2012

2
@kasimirのコールバック関数array_filterはオプションであり、マニュアルには、コールバックが指定されていない場合、FALSEに等しい入力のすべてのエントリ(ブール値への変換を参照)が削除されることが明記されています。したがって、使用array_filterはこれよりも正確であり、それは単なる異なる方法です;-)
Capsule

7

古い質問ですが、上記にリストされていないため、ソリューションを追加すると思いました。

function isArrayEmpty($array) {
    foreach($array as $key => $val) {
        if ($val !== '')
            return false;
    }
    return true;
}

1
empty()誤検知の結果をもたらす可能性があります。関数がfalsey値を処理する方法については、マニュアルを参照してください。strlen()代わりにの呼び出しをお勧めします。
mickmackusa 2018

@mickmackusaの虚偽についてのリマインダーをありがとう、空の文字列を明示的にチェックするように更新しました。
マルキン2018年

2

あなたは本当にそれを必要としません。
これらのフィールドを個別に検証し、このプロセスを完了することで、配列が空であるかどうか(または、同じである無効な値が含まれているかどうか)を確認できます。


面白い!これは配列を内破するよりも速いのだろうか。
カプセル

2
@Capsuleの配列サイズが6の場合、一生かけて配列をチェックしても、わずかな違いは見られません。1000を超えるサイズの場合は、配列をまったく使用しないことをお勧めします。
あなたの常識

私たちはウェブサイトについて話しているので、あなたはあなたの訪問者の数ごとにそれを掛けなければなりません。10の配列を計算する1000または100の訪問者の配列は、CPUコストの点で同じです。あなたのウェブサイトが人気を集めているので、配列の使用をやめることを決めることはできません;-)
Capsule

2

この方法で使用を簡素化します。

$array = []; //target array
$is_empty = true; //flag

foreach ($array as $key => $value) {
    if ($value != '')
        $is_empty = false;
}
if ($is_empty)
    echo 'array is empty!';
else
    echo 'array is not empty!';

0

$ arrayの定義が正しくなく、一重引用符が含まれています。それは読むべきです:

$array = array( 'RequestID' =>  $_POST["RequestID"],
                'ClientName' => $_POST["ClientName"],
                'Username' => $_POST["Username"],
                'RequestAssignee' => $_POST["RequestAssignee"],
                'Status' => $_POST["Status"],
                'Priority' => $_POST["Priority"] );

3
どちらでも使用できます。二重引用符は実際にはわずかに遅くなります。
アーロンハルン2011

@AaronHarun。奇妙な間違った引用があった質問の元のバージョンを見てください。とはいえ、これはそれを修正しますが、実際に質問自体に答えようとはしません。
TRIG

-1

同じ質問がありましたが、配列内の各要素を個別にチェックして、どれが空であるかを確認したいと思いました。空の配列要素をチェックして応答するには、キー値と実際の値を別々の配列に作成する必要があるため、これは予想よりも困難でした。

print_r($requestDecoded);
$arrayValues = array_values($requestDecoded);  //Create array of values
$arrayKeys = array_keys($requestDecoded);      //Create array of keys to count
$count = count($arrayKeys);
for($i = 0; $i < $count; $i++){  
    if ( empty ($arrayValues[$i] ) ) {         //Check which value is empty
        echo $arrayKeys[$i]. " can't be empty.\r\n";
    } 
}

結果:

Array
(
    [PONumber] => F12345
    [CompanyName] => Test
    [CompanyNum] => 222222
    [ProductName] => Test
    [Quantity] =>
    [Manufacturer] => Test
)

数量を空にすることはできません。


何?空であるforeach($array as $key => $value)かどうかを使用してテストするだけ$valueです。
カプセル

-2

テストされていませんが、ロジックを取得します:)

$error = 0;
foreach ($array as $k => $v){
    if (empty($v)) {
        $error++;
    }
}

if ($error == count($array)) {
    $error_str .= '<li>Please enter a value into at least one of the fields regarding the request you are searching for.</li>';
}

2
(私の反対票ではありませんが...)これは単に安定した/信頼できるアプローチではありません。 3v4l.org/g3Jf6 読者を混乱させたり、さらに悪いことに混乱させないように、この回答を削除してください。悪い方法を使用するように勧めてください。
mickmackusa 2018

-4

これは非常に簡単です。

foreach($array as $k => $v)
{
    if(empty($v))
    {
        unset($array[$k]);
    }
}
$show_error = count($array) == 0;

また、配列値のカプセル化を二重引用符に変更する必要があります。


彼は番号を必要としません。たった1つで十分です
あなたの常識

何?、彼はすべての要素が空であるかどうかを知りたがっていました、ブール値だけの数はありません
RobertPitt 2011

大佐がひどく言っているのは、PHPでは両方ともtruecount($array) == 0count($array)評価されるので、余分な比較と割り当ての手順を耳にする必要がないということだと思います。PHPでは割り当てのコストはごくわずかですが。
xzyfer 2011

ああ、そうだね、それは実際には大きな違いはないが、私はむしろブール値で作業したい。しかし、なぜ反対票を投じるのか、それは機能する方法であり、彼に必要な結果を生み出す。
RobertPitt 2011

配列が空であるかどうかを言うと、満たされた要素を1つだけ見つけるだけで十分です。それはLOGICと呼ばれます。
あなたの常識
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.