私の配列のいくつかの要素は、ユーザーが投稿したものに基づく空の文字列です。それらの要素を削除する必要があります。私はこれを持っています:
foreach($linksArray as $link)
{
if($link == '')
{
unset($link);
}
}
print_r($linksArray);
$linksArray
にはまだ空の要素があります。私はempty()
関数でもやってみましたが、結果は同じです。
文字列の配列を扱っているので、 array_filter()
を使うことができます。
print_r(array_filter($linksArray));
コールバックが指定されていない場合 、FALSE
に等しい配列のすべてのエントリが削除されます( ブール値への変換 を参照)。したがって、正確な文字列'0'
などの要素を保持する必要がある場合は、カスタムコールバックが必要になります。
// PHP < 5.3
print_r(array_filter($linksArray, create_function('$value', 'return $value !== "";')));
// PHP 5.3 and later
print_r(array_filter($linksArray, function($value) { return $value !== ''; }));
空の要素を削除するには array_filter
を使用します。
$emptyRemoved = array_filter($linksArray);
あなたの配列に(int) 0
があるなら、あなたは以下を使うことができます:
$emptyRemoved = remove_empty($linksArray);
function remove_empty($array) {
return array_filter($array, '_remove_empty_internal');
}
function _remove_empty_internal($value) {
return !empty($value) || $value === 0;
}
編集: あなたの要素はそれ自体空ではなく1つ以上のスペースを含んでいるかもしれません... array_filter
を使用する前に以下を使用できます
$trimmedArray = array_map('trim', $linksArray);
$linksArray = array_filter($linksArray);
「コールバックが指定されていない場合、FALSEに等しい入力のエントリはすべて削除されます。」 - http://php.net/manual/en/function.array-filter.php
このトピックに関する最も人気のある答えは絶対に間違っています。
次のPHPスクリプトを検討してください。
<?php
$arr = array('1', '', '2', '3', '0');
// Incorrect:
print_r(array_filter($arr));
// Correct:
print_r(array_filter($arr, 'strlen'));
どうしてこれなの?単一の「0」文字を含む文字列もブール値のfalseに評価されるため、空の文字列でなくてもフィルタリングされます。それはバグでしょう。
フィルタリング関数として組み込みのstrlen関数を渡しても問題はありません。空の文字列の場合はゼロ以外の整数、空の文字列の場合はゼロの整数が返されるためです。ゼロ以外の整数は、ブールに変換されると常にtrueと評価され、ゼロの整数はブールに変換されると常にfalseと評価されます。
それで、絶対的で、決定的で、正しい答えは:
$arr = array_filter($arr, 'strlen');
$myarray = array_filter($myarray, 'strlen'); //removes null values but leaves "0"
$myarray = array_filter($myarray); //removes all null values
あなたはただできる
array_filter($array)
"array_filter:"コールバックが指定されていない場合、FALSEと等しい入力のエントリはすべて削除されます。つまり、NULL、0、 '0'、 ''、FALSE、array()の値を持つ要素も削除されます。
他のオプションはやっている
array_diff($array, array(''))
nULL、 ''、FALSEの値を持つ要素を削除します。
お役に立てれば :)
これが一例です。
$a = array(0, '0', NULL, FALSE, '', array());
var_dump(array_filter($a));
// array()
var_dump(array_diff($a, array(0))) // 0 / '0'
// array(NULL, FALSE, '', array());
var_dump(array_diff($a, array(NULL))) // NULL / FALSE / ''
// array(0, '0', array())
総括する:
foreach($linksArray as $key => $link)
{
if($link === '')
{
unset($linksArray[$key]);
}
}
print_r($linksArray);
空の( ""空の文字列)要素を配列から削除するためのもう1つのライナー。
$array = array_filter($array, create_function('$a','return $a!=="";'));
注:このコードでは、意図的にnull、0、falseの各要素を保持しています。
あるいは、最初に配列要素をトリミングしたいかもしれません。
$array = array_filter($array, create_function('$a','return trim($a)!=="";'));
注:このコードはnull要素とfalse要素も削除します。
これは私が提案するコードです:
$myarray = array_values(array_filter(array_map('trim', $myarray), 'strlen'));
値はspace
やarray_filter
のようになるので... \n
を使用するのが良いと思いますが、これでは不十分です。
だから私はあなたが混合array_filter
とarray_map
を使うことを勧めます。
array_map
はトリミング用、array_filter
は空の値を削除するため、strlen
は0
値を維持するため、そしてarray_values
は必要に応じて再インデックス化するためです。
$myarray = array("\r", "\n", "\r\n", "", " ", "0", "a");
// "\r", "\n", "\r\n", " ", "a"
$new1 = array_filter($myarray);
// "a"
$new2 = array_filter(array_map('trim', $myarray));
// "0", "a"
$new3 = array_filter(array_map('trim', $myarray), 'strlen');
// "0", "a" (reindex)
$new4 = array_values(array_filter(array_map('trim', $myarray), 'strlen'));
var_dump($new1, $new2, $new3, $new4);
array(5) {
[0]=>
" string(1) "
[1]=>
string(1) "
"
[2]=>
string(2) "
"
[4]=>
string(1) " "
[6]=>
string(1) "a"
}
array(1) {
[6]=>
string(1) "a"
}
array(2) {
[5]=>
string(1) "0"
[6]=>
string(1) "a"
}
array(2) {
[0]=>
string(1) "0"
[1]=>
string(1) "a"
}
数値配列で作業していて、空の要素を削除した後でその配列にインデックスを付け直す必要がある場合は、array_values関数を使用します。
array_values(array_filter($array));
最も投票された答えは 間違った またはOPが空白文字列についてのみ話しているので少なくとも完全には真実ではない。これが徹底的な説明です:
まず最初に、 empty が何を意味するのかについて同意しなければなりません。あなたは除外するという意味ですか:
$element === false
)empty()
関数と同等ですか?空の文字列のみを除外するには :
$filtered = array_diff($originalArray, array(""));
厳密に false の値のみを除外するには、 コールバック 関数を使用する必要があります。
$filtered = array_diff($originalArray, 'myCallback');
function myCallback($var) {
return $var === false;
}
コールバックは、いくつかを除いて、 "falsey"値を除外したい任意の組み合わせにも役立ちます。 (例えば、すべてのnull
やfalse
などをフィルタリングし、0
だけを残す):
$filtered = array_filter($originalArray, 'myCallback');
function myCallback($var) {
return ($var === 0 || $var === '0');
}
3番目と4番目のケースは(ついに私たちの目的のために)同等であり、そのためにあなたが使わなければならないのはデフォルトです:
$filtered = array_filter($originalArray);
$a = array(1, '', '', '', 2, '', 3, 4);
$b = array_values(array_filter($a));
print_r($b)
多次元配列の場合
$data = array_map('array_filter', $data);
$data = array_filter($data);
次のスクリプトを使用して、配列から空の要素を削除します。
for ($i=0; $i<$count($Array); $i++)
{
if (empty($Array[$i])) unset($Array[$i]);
}
(string)0の配列値を保つためにこれをしなければなりませんでした
$url = array_filter($data, function ($value) {
return (!empty($value) || $value === 0 || $value==='0');
});
$out_array = array_filter($input_array, function($item)
{
return !empty($item['key_of_array_to_check_whether_it_is_empty']);
}
);
function trim_array($Array)
{
foreach ($Array as $value) {
if(trim($value) === '') {
$index = array_search($value, $Array);
unset($Array[$index]);
}
}
return $Array;
}
foreach($arr as $key => $val){
if (empty($val)) unset($arr[$key];
}
ループに代わるものを提供したいだけで...キーのギャップにも対処しています...
私の場合は、操作が完了したときにシーケンシャル配列キーを保持したかったのです(奇数だけでなく、奇妙なキーだけを探すようにコードを設定することは私にとっては脆弱であり、将来に向いていません)
私はこのような何かを探していました: http://gotofritz.net/blog/howto/removing-empty-array-elements-php/
Array_filterとarray_sliceの組み合わせがうまくいきます。
$example = array_filter($example);
$example = array_slice($example,0);
効率性やベンチマークについてはわかりませんが、うまくいきます。
1行だけ:更新(@sutherに感謝):
$array_without_empty_values = array_filter($array);
$my = ("0"=>" ","1"=>"5","2"=>"6","3"=>" ");
foreach ($my as $key => $value) {
if (is_null($value)) unset($my[$key]);
}
foreach ($my as $key => $value) {
echo $key . ':' . $value . '<br>';
}
出力
1:5
2時06分
空の値を削除するにはarray_filter
関数を使用します。
$linksArray = array_filter($linksArray);
print_r($linksArray);
空の配列要素を削除する
function removeEmptyElements(&$element)
{
if (is_array($element)) {
if ($key = key($element)) {
$element[$key] = array_filter($element);
}
if (count($element) != count($element, COUNT_RECURSIVE)) {
$element = array_filter(current($element), __FUNCTION__);
}
return $element;
} else {
return empty($element) ? false : $element;
}
}
$data = array(
'horarios' => array(),
'grupos' => array(
'1A' => array(
'Juan' => array(
'calificaciones' => array(
'Matematicas' => 8,
'Español' => 5,
'Ingles' => 9,
),
'asistencias' => array(
'enero' => 20,
'febrero' => 10,
'marzo' => '',
)
),
'Damian' => array(
'calificaciones' => array(
'Matematicas' => 10,
'Español' => '',
'Ingles' => 9,
),
'asistencias' => array(
'enero' => 20,
'febrero' => '',
'marzo' => 5,
)
),
),
'1B' => array(
'Mariana' => array(
'calificaciones' => array(
'Matematicas' => null,
'Español' => 7,
'Ingles' => 9,
),
'asistencias' => array(
'enero' => null,
'febrero' => 5,
'marzo' => 5,
)
),
),
)
);
$data = array_filter($data, 'removeEmptyElements');
var_dump($data);
できます!
試してみる** **例
$or = array(
'PersonalInformation.first_name' => $this->request->data['User']['first_name'],
'PersonalInformation.last_name' => $this->request->data['User']['last_name'],
'PersonalInformation.primary_phone' => $this->request->data['User']['primary_phone'],
'PersonalInformation.dob' => $this->request->data['User']['dob'],
'User.email' => $this->request->data['User']['email'],
);
$or = array_filter($or);
$condition = array(
'User.role' => array('U', 'P'),
'User.user_status' => array('active', 'lead', 'inactive'),
'OR' => $or
);
あなたの方法に従って、あなたはただ別の配列のそれらの要素を捕らえて、それを次のように使うことができます、
foreach($linksArray as $link){
if(!empty($link)){
$new_arr[] = $link
}
}
print_r($new_arr);