web-dev-qa-db-ja.com

PHP配列からNULL、FALSE、および ''-0ではない-を削除します

NULLFALSE''の値を削除したい。

array_filterを使用しましたが、0も削除されます。

やりたいことはありますか?

array(NULL,FALSE,'',0,1) -> array(0,1)

array_filteridentical比較演算子 を使用する場合、正常に機能するはずです。

ここに例があります

$values = [NULL, FALSE, '', 0, 1];

function myFilter($var){
  return ($var !== NULL && $var !== FALSE && $var !== '');
}

$res = array_filter($values, 'myFilter');

または、フィルタリング関数を定義したくない場合は、無名関数(クロージャ)を使用することもできます。

$res = array_filter($values, function($value) {
    return ($value !== null && $value !== false && $value !== ''); 
});

数値だけが必要な場合は、コールバックとして is_numeric を使用できます。 example

$res = array_filter($values, 'is_numeric');
44
Max Girkens

From http://php.net/manual/en/function.array-filter.php#111091 から:

NULL、FALSE、空の文字列を削除し、値を0のままにする場合は、コールバック関数としてstrlenを使用できます。

array_filter($array, 'strlen');
37

array_filterは機能しません。デフォルトでは、FALSEと同等のものがすべて削除され、PHPは0をfalseと同等と見なします。 PHPマニュアル はこれについてこの件について述べています:

ブール値に変換する場合、次の値はFALSEと見なされます。

  • ブール値FALSE自体
  • 整数0(ゼロ)
  • float 0.0(ゼロ)
  • 空の文字列と文字列 "0"
  • 要素がゼロの配列
  • メンバー変数がゼロのオブジェクト(PHP 4のみ)
  • 特殊なタイプNULL(未設定の変数を含む)
  • 空のタグから作成されたSimpleXMLオブジェクト

他のすべての値はTRUE(リソースを含む)と見なされます。

アイテムを削除するかどうかをarray_filterに伝える、自分で作成した関数へのコールバックを使用して、2番目のパラメーターをarray_filterに渡すことができます。

すべてのFALSEに相当する値以外のゼロを削除する場合、これは簡単に記述できる関数です。

function RemoveFalseButNotZero($value) {
  return ($value || is_numeric($value));
}

次に、元の配列をフィルター処理された配列で上書きします。

$array = array_filter($array, "RemoveFalseButNotZero");
5
AgentConundrum

Array_filterでカスタムコールバック関数を使用します。この例を参照してください。PHPマニュアル、コールバック関数の使用方法についての説明を参照してください。この例のコールバック関数は、奇数/偶数に基づいてフィルタリングします。あなたの要件。

<?php
function odd($var)
{
    // returns whether the input integer is odd
    return($var & 1);
}

function even($var)
{
    // returns whether the input integer is even
    return(!($var & 1));
}

$array1 = array("a"=>1, "b"=>2, "c"=>3, "d"=>4, "e"=>5);
$array2 = array(6, 7, 8, 9, 10, 11, 12);

echo "Odd :\n";
print_r(array_filter($array1, "odd"));
echo "Even:\n";
print_r(array_filter($array2, "even"));
?> 
2
Amit

ワンライナーは常にいいです。

$clean_array = array_diff(array_map('trim', $my_array), array('', NULL, FALSE));

説明:

  • array_diffの最初のパラメーター:$my_arrayのトリミングされたバージョン。 array_mapを使用すると、周囲の空白はtrim関数を介してすべての要素から削除されます。要素に空白以外の文字列(タブ、スペースなど)が含まれている場合は、トリムバージョンを使用することをお勧めします。これも削除したいと思います。要素をトリムしたくない場合は、1番目のパラメーターに$ my_arrayを簡単に使用できます。
  • array_diffの2番目のパラメーター_:$my_arrayから削除するアイテムの配列。
  • 出力: 1番目の配列に含まれ、2番目の配列には含まれない要素の配列。この場合、''NULL、およびFALSEは2番目の配列内にあるため、array_diffによって返されることはありません。

編集:

2番目の配列にNULLFALSEを含める必要がないことがわかります。代わりに、''を指定するだけで、同じように機能します。

$clean_array = array_diff(array_map('trim', $my_array), array(''));
1
seane

それが1未満で-1より大きいかどうかを確認し、削除しない場合は...

$arrayValue = (NULL,FALSE,'',0,1);
$newArray = array();
foreach($arrayValue as $value) {
    if(is_int($value) || ($value>-1 && $value <1)) {
        $newArray[] = $value;
    }
}

print_r($newArray);
0
Vinoth Babu
function my_filter($var)
{
    // returns values that are neither false nor null (but can be 0)
    return ($var !== false && $var !== null && $var !== '');
}

$entry = array(
             0 => 'foo',
             1 => false,
             2 => -1,
             3 => null,
             4 => '',
             5 => 0
          );

print_r(array_filter($entry, 'my_filter'));

出力:

Array
(
    [0] => foo
    [2] => -1
    [5] => 0
)
0

または、array_filter とともに 'strlen'パラメータ:

// removes all NULL, FALSE and Empty Strings but leaves 0 (zero) values
$result = array_filter($array, 'strlen');

https://www.php.net/manual/en/function.array-filter.php#111091

0
Marcio Bera