web-dev-qa-db-ja.com

空の配列要素を削除する

私の配列のいくつかの要素は、ユーザーが投稿したものに基づく空の文字列です。それらの要素を削除する必要があります。私はこれを持っています:

foreach($linksArray as $link)
{
    if($link == '')
    {
        unset($link);
    }
}
print_r($linksArray);

$linksArrayにはまだ空の要素があります。私はempty()関数でもやってみましたが、結果は同じです。 

675
Will

文字列の配列を扱っているので、 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 !== ''; }));
1345
BoltClock

空の要素を削除するには 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);
152
Andrew Moore
$linksArray = array_filter($linksArray);

「コールバックが指定されていない場合、FALSEに等しい入力のエントリはすべて削除されます。」 - http://php.net/manual/en/function.array-filter.php

93
tamasd

このトピックに関する最も人気のある答えは絶対に間違っています。

次の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');
90
Ron Cemer
    $myarray = array_filter($myarray, 'strlen');  //removes null values but leaves "0"
    $myarray = array_filter($myarray);            //removes all null values
51
matija kancijan

あなたはただできる

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())

総括する:

  • 0または '0'を指定すると、0と '0'が削除されます。
  • NULL、FALSEまたは ''はNULL、FALSEおよび ''を削除します
39
helpse
foreach($linksArray as $key => $link) 
{ 
    if($link === '') 
    { 
        unset($linksArray[$key]); 
    } 
} 
print_r($linksArray); 
28
Mark Baker

空の( ""空の文字列)要素を配列から削除するためのもう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要素も削除します。

22
marcovtwout

要するに:

これは私が提案するコードです:

$myarray =  array_values(array_filter(array_map('trim', $myarray), 'strlen'));

説明:

値はspacearray_filterのようになるので... \nを使用するのが良いと思いますが、これでは不十分です。

だから私はあなたが混合‍‍array_filterarray_mapを使うことを勧めます。

array_mapはトリミング用、array_filterは空の値を削除するため、strlen0値を維持するため、そして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"
}

オンラインテスト

http://phpio.net/s/5yg0

13
Nabi K.A.Z.

数値配列で作業していて、空の要素を削除した後でその配列にインデックスを付け直す必要がある場合は、array_values関数を使用します。

array_values(array_filter($array));

PHPインデックスの再作成も参照してください。

10
mulquin

最も投票された答えは 間違った またはOPが空白文字列についてのみ話しているので少なくとも完全には真実ではない。これが徹底的な説明です:

empty はどういう意味ですか?

まず最初に、 empty が何を意味するのかについて同意しなければなりません。あなたは除外するという意味ですか:

  1. 空の文字列 only( "")
  2. 厳密にfalse values? ($element === false
  3. falsey values? (つまり、0、0.0、 ""、 "0"、NULL、array()...)
  4. pHPのempty()関数と同等ですか?

どのように値を除外しますか

空の文字列のみを除外するには

$filtered = array_diff($originalArray, array(""));

厳密に false の値のみを除外するには、 コールバック 関数を使用する必要があります。

$filtered = array_diff($originalArray, 'myCallback');
function myCallback($var) {
    return $var === false;
}

コールバックは、いくつかを除いて、 "falsey"値を除外したい任意の組み合わせにも役立ちます。 (例えば、すべてのnullfalseなどをフィルタリングし、0だけを残す):

$filtered = array_filter($originalArray, 'myCallback');
function myCallback($var) {
    return ($var === 0 || $var === '0');
}

3番目と4番目のケースは(ついに私たちの目的のために)同等であり、そのためにあなたが使わなければならないのはデフォルトです:

$filtered = array_filter($originalArray);
9
Cranio
$a = array(1, '', '', '', 2, '', 3, 4);
$b = array_values(array_filter($a));

print_r($b)
8
user2511140

多次元配列の場合 

$data = array_map('array_filter', $data);
$data = array_filter($data);
7
HMagdy

次のスクリプトを使用して、配列から空の要素を削除します。

for ($i=0; $i<$count($Array); $i++)
  {
    if (empty($Array[$i])) unset($Array[$i]);
  }
7
concept w

(string)0の配列値を保つためにこれをしなければなりませんでした

$url = array_filter($data, function ($value) {
  return (!empty($value) || $value === 0 || $value==='0');
});
7
Matt
$out_array = array_filter($input_array, function($item) 
{ 
    return !empty($item['key_of_array_to_check_whether_it_is_empty']); 
}
);
6
Naitik Shah
function trim_array($Array)
{
    foreach ($Array as $value) {
        if(trim($value) === '') {
            $index = array_search($value, $Array);
            unset($Array[$index]);
        }
    }
    return $Array;
}
6
ali Farmani
foreach($arr as $key => $val){
   if (empty($val)) unset($arr[$key];
}
5
mak ashtekar

ループに代わるものを提供したいだけで...キーのギャップにも対処しています...

私の場合は、操作が完了したときにシーケンシャル配列キーを保持したかったのです(奇数だけでなく、奇妙なキーだけを探すようにコードを設定することは私にとっては脆弱であり、将来に向いていません)

私はこのような何かを探していました: http://gotofritz.net/blog/howto/removing-empty-array-elements-php/

Array_filterとarray_sliceの組み合わせがうまくいきます。

$example = array_filter($example); $example = array_slice($example,0);

効率性やベンチマークについてはわかりませんが、うまくいきます。

5
Chrisdigital

1行だけ:更新(@sutherに感謝):

$array_without_empty_values = array_filter($array);
4
Matt
$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分

4
Naitik Shah

空の値を削除するにはarray_filter関数を使用します。

$linksArray = array_filter($linksArray);
print_r($linksArray);
4
Ankit Gupta

空の配列要素を削除する

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);

できます!

2
iBet7o

試してみる** **例

$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
    );
0
Ashish pathak

あなたの方法に従って、あなたはただ別の配列のそれらの要素を捕らえて、それを次のように使うことができます、

foreach($linksArray as $link){
   if(!empty($link)){
      $new_arr[] = $link
   }
}

print_r($new_arr);
0
Shahrukh Anwar