array_filter()
デフォルトではタイプセンシティブではありません。これは、ゼロっぽい、false-y、null、空の値が削除されることを意味します。フォローする私のリンクは、この点を示しています。
OPのサンプル入力配列は2次元です。データ構造が静的である場合、再帰は必要ありません。多次元配列から長さゼロの値をフィルター処理したい人のために、静的2次元法と再帰法を提供します。
静的2次元配列:このコードは、第2レベルの要素に対して「ゼロセーフ」フィルターを実行してから、空のサブ配列を削除します:(このメソッドが異なる(よりトリッキーな)配列データで機能することを確認するには、このデモを参照してください)
$array=[
['Name'=>'','EmailAddress'=>'']
];
var_export(
array_filter( // remove the 2nd level in the event that all subarray elements are removed
array_map( // access/iterate 2nd level values
function($v){
return array_filter($v,'strlen'); // filter out subarray elements with zero-length values
},$array // the input array
)
)
);
ワンライナーと同じコードは次のとおりです。
var_export(array_filter(array_map(function($v){return array_filter($v,'strlen');},$array)));
出力(元々OPによって指定されたとおり):
array (
)
*空のサブ配列を削除したくない場合は、外部array_filter()
呼び出しを削除するだけです。
深さが不明な多次元配列の再帰的方法:配列内のレベル数が不明な場合、再帰は論理的な手法です。次のコードは、各サブアレイを処理し、長さがゼロの値と空のサブアレイを削除します。 これは、いくつかのサンプル入力を含むこのコードのデモです。
$array=[
['Name'=>'','Array'=>['Keep'=>'Keep','Drop'=>['Drop2'=>'']],'EmailAddress'=>'','Pets'=>0,'Children'=>null],
['Name'=>'','EmailAddress'=>'','FavoriteNumber'=>'0']
];
function removeEmptyValuesAndSubarrays($array){
foreach($array as $k=>&$v){
if(is_array($v)){
$v=removeEmptyValuesAndSubarrays($v); // filter subarray and update array
if(!sizeof($v)){ // check array count
unset($array[$k]);
}
}elseif(!strlen($v)){ // this will handle (int) type values correctly
unset($array[$k]);
}
}
return $array;
}
var_export(removeEmptyValuesAndSubarrays($array));
出力:
array (
0 =>
array (
'Array' =>
array (
'Keep' => 'Keep',
),
'Pets' => 0,
),
1 =>
array (
'FavoriteNumber' => '0',
),
)
誰かが私の再帰的メソッドを破る入力配列を発見した場合は、コメントとして(最も単純な形式で)投稿してください。回答を更新します。