it-swarm.com.de

Leere Array-Elemente entfernen

Einige Elemente in meinem Array sind leere Zeichenfolgen, die darauf basieren, was der Benutzer übermittelt hat. Ich muss diese Elemente entfernen. Ich habe das:

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

Aber es funktioniert nicht, $linksArray hat noch leere Elemente. Ich habe es auch mit der Funktion empty() versucht, aber das Ergebnis ist dasselbe. 

675
Will

Da es sich um ein Array von Strings handelt, können Sie einfach array_filter() verwenden, das all dies bequem für Sie erledigt:

print_r(array_filter($linksArray));

Beachten Sie, dass , wenn kein Rückruf bereitgestellt wird, alle Einträge des Arrays, die FALSE (siehe Konvertierung in Boolean ) entsprechen, entfernt werden. Wenn Sie also Elemente mit der exakten Zeichenfolge '0' beibehalten möchten, benötigen Sie einen benutzerdefinierten Rückruf:

// 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

Sie können array_filter verwenden, um leere Elemente zu entfernen:

$emptyRemoved = array_filter($linksArray);

Wenn Sie (int) 0 in Ihrem Array haben, können Sie Folgendes verwenden:

$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: Vielleicht sind Ihre Elemente an sich nicht leer, sondern enthalten ein oder mehrere Leerzeichen ... Sie können Folgendes verwenden, bevor Sie array_filter verwenden.

$trimmedArray = array_map('trim', $linksArray);
152
Andrew Moore
$linksArray = array_filter($linksArray);

"Wenn kein Rückruf geliefert wird, werden alle mit FALSE übereinstimmenden Einträge der Eingabe entfernt." - http://php.net/manual/de/function.array-filter.php

93
tamasd

Die populärste Antwort zu diesem Thema ist absolut unkorrekt.

Betrachten Sie das folgende PHP - Skript:

<?php
$arr = array('1', '', '2', '3', '0');
// Incorrect:
print_r(array_filter($arr));
// Correct:
print_r(array_filter($arr, 'strlen'));

Warum ist das? Da eine Zeichenfolge, die ein einzelnes "0" -Zeichen enthält, auch als boolesches "false" ausgewertet wird, wird sie auch gefiltert, obwohl sie keine leere Zeichenfolge ist. Das wäre ein Fehler.

Das Übergeben der eingebauten strlen-Funktion als Filterfunktion funktioniert, da für eine nicht leere Zeichenfolge eine ganze Zahl ungleich Null und für eine leere Zeichenfolge eine ganze Zahl null zurückgegeben wird. Nicht-Null-Ganzzahlen werden immer als wahr ausgewertet, wenn sie in einen booleschen Wert konvertiert werden.

Die absolute, endgültige, richtige Antwort lautet also:

$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

Du kannst es einfach tun

array_filter($array)

array_filter: "Wenn kein Callback bereitgestellt wird, werden alle Einträge der Eingabe, die gleich FALSE sind, entfernt." Das bedeutet, dass Elemente mit den Werten NULL, 0, '0', '', FALSE, array () ebenfalls entfernt werden.

Die andere Option ist zu tun

array_diff($array, array(''))

dadurch werden Elemente mit den Werten NULL, '' und FALSE entfernt.

Hoffe das hilft :)

AKTUALISIEREN

Hier ist ein Beispiel.

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

Um zusammenzufassen:

  • 0 oder '0' entfernt 0 und '0'
  • NULL, FALSE oder '' entfernt NULL, FALSE und ''
39
helpse
foreach($linksArray as $key => $link) 
{ 
    if($link === '') 
    { 
        unset($linksArray[$key]); 
    } 
} 
print_r($linksArray); 
28
Mark Baker

Ein weiterer Liner zum Entfernen leerer ("" leerer Zeichenketten) Elemente aus Ihrem Array.

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

Hinweis: Dieser Code enthält absichtlich Null-, 0- und Falschelemente.


Oder möchten Sie zuerst Ihre Array-Elemente trimmen:

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

Hinweis: Dieser Code entfernt auch Null- und Falschelemente.

22
marcovtwout

Zusamenfassend:

Dies ist mein vorgeschlagener Code:

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

Erläuterung:

Ich denke, dass array_filter gut ist, aber nicht genug, da Werte wie space und \n ... im Array bleiben und dies normalerweise schlecht ist.

Ich schlage daher vor, die Mischung ‍‍array_filter und array_map zu verwenden.

array_map dient zum Beschneiden, array_filter dient zum Entfernen leerer Werte, strlen ist für die Beibehaltung des 0-Werts und array_values dient zur erneuten Indizierung, falls dies erforderlich ist.

Proben:

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

Ergebnisse:

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

Online-Test:

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

13
Nabi K.A.Z.

Wenn Sie mit einem numerischen Array arbeiten und das Array nach dem Entfernen leerer Elemente neu indexieren müssen, verwenden Sie die Funktion array_values ​​:

array_values(array_filter($array));

Siehe auch: PHP Array reindexieren?

10
mulquin

Die am meisten gewählte Antwort ist falsch oder zumindest nicht ganz richtig, da das OP nur von leeren Zeichenketten spricht. Hier eine ausführliche Erklärung:

Was bedeutet empty?

Zunächst müssen wir uns darauf einigen, was empty bedeutet. Wollen Sie herausfiltern:

  1. die leere Zeichenfolgen only ("")?
  2. die streng falsch Werte? ($element === false)
  3. die falsey werte? (d. h. 0, 0.0, "", "0", NULL, array () ...)
  4. das Äquivalent der empty()-Funktion von PHP?

Wie filtern Sie die Werte heraus?

So filtern Sie nur leere Zeichenfolgen:

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

Um nur die Werte von streng false auszufiltern, müssen Sie die Funktion callback verwenden:

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

Der Rückruf ist auch für jede Kombination nützlich, in der Sie die "falsey" -Werte herausfiltern möchten, mit Ausnahme einiger. (Filtern Sie beispielsweise alle null und false usw.), wobei nur 0 übrig bleibt.

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

Dritter und vierter Fall sind (für unsere Zwecke endlich) gleichwertig, und dazu müssen Sie nur den Standard verwenden:

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

print_r($b)
8
user2511140

Für mehrdimensionales Array 

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

Ich verwende das folgende Skript, um leere Elemente aus einem Array zu entfernen

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

Ich musste dies tun, um einen Array-Wert von (Zeichenfolge) 0 beizubehalten

$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

Ich möchte nur eine Alternative zu Loops beitragen ... auch Lücken in Schlüsseln beheben ...

In meinem Fall wollte ich sequentielle Array-Tasten behalten, wenn die Operation abgeschlossen war (nicht nur ungerade Zahlen, was ich angestarrt habe. Das Einrichten von Code, um nur nach ungeraden Schlüsseln zu suchen, erschien mir fragil und nicht zukunftsorientiert.)

Ich suchte nach etwas mehr davon: http://gotofritz.net/blog/howto/removing-empty-array-elements-php/

Die Kombination von array_filter und array_slice macht den Trick.

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

Keine Vorstellung von Wirkungsgraden oder Benchmarks, aber es funktioniert.

5
Chrisdigital

Nur eine Zeile: Update (Danke an @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>';
} 

Ausgabe

1: 5

2: 6

4
Naitik Shah

verwenden Sie die Funktion array_filter, um leere Werte zu entfernen:

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

Leere Array-Elemente entfernen

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

Es klappt!

2
iBet7o

probiere dies ** ** Beispiel

$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

Je nach Methode können Sie diese Elemente in einem anderen Array abfangen und wie folgt verwenden:

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

print_r($new_arr);
0
Shahrukh Anwar