Usuń puste elementy tablicy

Niektóre elementy w mojej tablicy są pustymi łańcuchami w oparciu o to, co użytkownik przesłał. Muszę usunąć te elementy. Mam to:

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

Ale to nie działa, $linksArray nadal ma puste elementy. Próbowałem również zrobić to za pomocą funkcji empty(), ale wynik jest taki sam.

Author: BoltClock, 2010-09-07

25 answers

Ponieważ masz do czynienia z tablicą łańcuchów, możesz po prostu użyć array_filter(), który wygodnie załatwia to wszystko za ciebie:

print_r(array_filter($linksArray));

Należy pamiętać, że jeśli nie zostanie dostarczone wywołanie zwrotne , wszystkie wpisy tablicy równe FALSE (Zobacz konwersja na boolean) zostaną usunięte. Jeśli więc potrzebujesz zachować elementy, które są np. dokładnym ciągiem '0', będziesz potrzebował niestandardowego wywołania zwrotnego:

// 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 !== ''; }));
 1258
Author: BoltClock,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-03-10 12:10:10

Możesz użyć array_filter aby usunąć puste elementy:

$emptyRemoved = array_filter($linksArray);

Jeśli masz (int) 0 w swojej tablicy, możesz użyć:

$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;
}

EDIT: Może twoje elementy nie są puste per se, ale zawierają jedną lub więcej spacji... Możesz użyć następujących przed użyciem array_filter

$trimmedArray = array_map('trim', $linksArray);
 148
Author: Andrew Moore,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-02-10 16:51:48
$linksArray = array_filter($linksArray);

"Jeśli nie zostanie podane wywołanie zwrotne, wszystkie wpisy o wartości FALSE zostaną usunięte."-- http://php.net/manual/en/function.array-filter.php

 89
Author: tamasd,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-09-06 21:14:14

Najpopularniejsza odpowiedź na ten temat jest absolutnie błędna.

Rozważ następujący skrypt PHP:

<?php
$arr = array('1', '', '2', '3', '0');
// Incorrect:
print_r(array_filter($arr));
// Correct:
print_r(array_filter($arr, 'strlen'));
Dlaczego tak jest? Ponieważ łańcuch zawierający pojedynczy znak '0' jest również obliczany na wartość logiczną false, więc nawet jeśli nie jest to pusty łańcuch, nadal będzie filtrowany. To byłby błąd.

Przekazanie wbudowanej funkcji strlen jako funkcji filtrującej będzie działać, ponieważ zwraca niezerową liczbę całkowitą dla niepustego ciągu, a zero całkowitą dla pusty ciąg. Niezerowe liczby całkowite zawsze oceniają na true po przekonwertowaniu na wartość logiczną, podczas gdy zerowe liczby całkowite zawsze oceniają na false po przekonwertowaniu na wartość logiczną.

Więc absolutna, ostateczna, poprawna odpowiedź brzmi:
$arr = array_filter($arr, 'strlen');
 74
Author: Ron Cemer,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-06-28 18:29:07
    $myarray = array_filter($myarray, 'strlen');  //removes null values but leaves "0"
    $myarray = array_filter($myarray);            //removes all null values
 49
Author: matija kancijan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-04-22 15:12:23

You can just do

array_filter($array)

Array_filter: "jeśli nie zostanie podane wywołanie zwrotne, wszystkie wpisy o wartości FALSE zostaną usunięte."Oznacza to, że elementy o wartościach NULL, 0, '0',", FALSE, array () również zostaną usunięte.

Inną opcją jest robienie

array_diff($array, array(''))

Który usunie elementy o wartościach NULL, " oraz FALSE.

Mam nadzieję, że to pomoże:)

UPDATE

Oto przykład.
$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())

Podsumowując:

  • 0 lub ' 0 ' usunie 0 i '0'
  • NULL, FALSE lub "usunie NULL, FALSE i"
 38
Author: helpse,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-02-16 21:31:04
foreach($linksArray as $key => $link) 
{ 
    if($link === '') 
    { 
        unset($linksArray[$key]); 
    } 
} 
print_r($linksArray); 
 28
Author: Mark Baker,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-02-10 17:13:47

Kolejny liner usuwający puste (""empty string) elementy z tablicy.

$array = array_filter($array, create_function('$a','return $a!=="";'));

Uwaga: Ten kod celowo zachowuje elementy null, 0 I false.


A może chcesz najpierw przyciąć elementy tablicy:

$array = array_filter($array, create_function('$a','return trim($a)!=="";'));

Uwaga: Ten kod usuwa również elementy null I false.

 22
Author: marcovtwout,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-02-12 08:12:43

Jeśli pracujesz z tablicą numeryczną i musisz ponownie indeksować tablicę po usunięciu pustych elementów, użyj array_values Funkcja:

array_values(array_filter($array));

Zobacz też: tablica reindex PHP?

 9
Author: mulquin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:26:33

Najczęściej głosowana odpowiedź jest zła lub przynajmniej nie do końca prawdziwa, ponieważ OP mówi tylko o pustych strunach. Oto dokładne wyjaśnienie:

Co oznacza pusty ?

Przede wszystkim musimy się zgodzić co oznacza pusty . Czy chcesz odfiltrować:

  1. the empty strings only ("")?
  2. ściśle fałszywe wartości? ($element === false)
  3. wartości false ? (tj. 0, 0, 0, "", "0", NULL, array()...)
  4. odpowiednik empty() funkcji PHP?

Jak odfiltrować wartości

Aby odfiltrować tylko puste ciągi :

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

Aby odfiltrować tylko ściśle false wartości, musisz użyć funkcji callback:

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

Wywołanie zwrotne jest również przydatne dla dowolnej kombinacji, w której chcesz odfiltrować wartości "falsey", z wyjątkiem niektórych. (Na przykład filtruj co null i false, itp, pozostawiając tylko 0):

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

Trzeci i czwarty przypadek są (dla naszych celów w końcu) równoważne, a do tego wszystko, co musisz użyć, to domyślne:

$filtered = array_filter($originalArray);
 9
Author: Cranio,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-01-31 01:31:05
$a = array(1, '', '', '', 2, '', 3, 4);
$b = array_values(array_filter($a));

print_r($b)
 8
Author: user2511140,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-10-22 21:14:11

Używam poniższego skryptu do usuwania pustych elementów z tablicy

for ($i=0; $i<$count($Array); $i++)
  {
    if (empty($Array[$i])) unset($Array[$i]);
  }
 7
Author: concept w,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-11-09 22:34:36

Dla tablicy wielowymiarowej

$data = array_map('array_filter', $data);
$data = array_filter($data);
 7
Author: HMagdy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-04-29 10:46:00

Musiałem to zrobić, aby zachować wartość tablicy (string) 0

$url = array_filter($data, function ($value) {
  return (!empty($value) || $value === 0 || $value==='0');
});
 7
Author: Matt,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-02-10 15:58:52

W skrócie:

To jest mój sugerowany kod:

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

Wyjaśnienie:

Myślę, że użycie array_filter jest dobre, ale nie wystarczające, ponieważ wartości są takie jak space i \n,... trzymaj w tablicy i to jest zwykle złe.

Więc sugeruję użycie mieszanki array_filter i array_map.

array_map jest do przycinania, {[3] } jest do usuwania pustych wartości, strlen jest do przechowywania 0 wartość, a array_values jest do ponownego indeksowania, jeśli potrzebne.

Próbki:

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

Wyniki:

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"
}

Test Online:

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

 7
Author: Nabi K.A.Z.,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-11-22 22:10:49
$out_array = array_filter($input_array, function($item) 
{ 
    return !empty($item['key_of_array_to_check_whether_it_is_empty']); 
}
);
 6
Author: Naitik Shah,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-02-10 16:01:48

Po prostu chcę stworzyć alternatywę dla pętli...również usuwanie luk w kluczach...

W moim przypadku chciałem zachować sekwencyjne klawisze tablicy po zakończeniu operacji (nie tylko liczby nieparzyste, na co patrzyłem. Ustawienie kodu, aby szukać tylko dziwnych kluczy, wydawało mi się kruche i nie przyjazne dla przyszłości.)

Szukałem czegoś bardziej podobnego: http://gotofritz.net/blog/howto/removing-empty-array-elements-php/

Kombinacja array_filter i array_slice załatwiają sprawę.

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

Brak pomysłu na wydajność lub benchmarki, ale to działa.

 5
Author: Chrisdigital,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-11-23 00:21:55
function trim_array($Array)
{
    foreach ($Array as $value) {
        if(trim($value) === '') {
            $index = array_search($value, $Array);
            unset($Array[$index]);
        }
    }
    return $Array;
}
 5
Author: ali Farmani,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-08-05 08:07:26
foreach($arr as $key => $val){
   if (empty($val)) unset($arr[$key];
}
 4
Author: mak ashtekar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-02-14 17:35:33

Użyj funkcji array_filter, Aby usunąć puste wartości:

$linksArray = array_filter($linksArray);
print_r($linksArray);
 4
Author: Ankit Gupta,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-05-19 12:03:17

Tylko jedna linijka : Aktualizacja (Dzięki @ suther):

$array_without_empty_values = array_filter($array);
 4
Author: Matt,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-03-01 07:37:39
$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>';
} 

Output

1:5

2:6

 4
Author: Naitik Shah,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-11-20 14:00:54

Usuń puste elementy tablicy

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);
To działa!
 2
Author: iBet7o,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-07-09 10:45:55

Spróbuj tego. ** ** Przykład

$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
Author: Ashish pathak,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-03-11 11:49:24

Zgodnie z metodą, możesz po prostu złapać te elementy w innej tablicy i użyć tej w następujący sposób,

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

print_r($new_arr);
 0
Author: Shahrukh Anwar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-06-05 08:52:48