Bestimmte Werte aus einem Array entfernen (Thema: PHP Beispiele)

Darstellung verschiedener Techniken, mit denen einzelne Werte aus einem Array entfern werden können

1. Werte anhand ihres Schlüssels mit unset() löschen


Ist der Schlüssel des zu löschenden Werts bekannt, dann kann die Funktion unset($arr['schlüssel']) verwendet werden.
PHP-Code
<?php
	$mitarbeiter = array('peter' => array(32, 'erfahren'), 'tom' => array(24, 'einsteiger'));
	var_dump($mitarbeiter);
	// Peter verlässt das Unternehmen
	unset($mitarbeiter['peter']);
	var_dump($mitarbeiter);
?>
Ausgabe
array(2) {
  ["peter"]=>
  array(2) {
    [0]=>
    int(32)
    [1]=>
    string(8) "erfahren"
  }
  ["tom"]=>
  array(2) {
    [0]=>
    int(24)
    [1]=>
    string(10) "einsteiger"
  }
}
array(1) {
  ["tom"]=>
  array(2) {
    [0]=>
    int(24)
    [1]=>
    string(10) "einsteiger"
  }
}

2. Alle Werte aus A entfernen, die auch in B sind (Differenz)


Mit array_diff($arr1, $arr2 [, $arr3, ...]) kann die Differenz von zwei oder mehr Arrays ermittelt werden:
PHP-Code
<?php
	// Farben mit denen man theoretisch die Wohnung streichen könnte
	$wichtigeFarben = array('schwarz', 'weiß', 'gelb', 'blau', 'grün', 'rosa', 'rot', 'braun');
	// Farben, die unschön aussehen oder häufig auf Kritik stoßen
	$unbeliebteFarben = array('schwarz', 'rosa', 'braun');
	// Mit diesen Farben könnte man streichen
	var_dump(array_diff($wichtigeFarben, $unbeliebteFarben));
?>
Ausgabe
array(5) {
  [1]=>
  string(4) "weiß"
  [2]=>
  string(4) "gelb"
  [3]=>
  string(4) "blau"
  [4]=>
  string(4) "grün"
  [6]=>
  string(3) "rot"
}

Den größten Wert aus einem Array entfernen (bzw. die größten Werte, falls mehrere Zahlen gleichermaßen den größten Wert haben):
PHP-Code
<?php
	$arr = array(15, 29, 122, 1337, -7, 19, 1337);
	var_dump(array_diff($arr, array(max($arr))));
?>
Ausgabe
array(5) {
  [0]=>
  int(15)
  [1]=>
  int(29)
  [2]=>
  int(122)
  [4]=>
  int(-7)
  [5]=>
  int(19)
}

Den kleinsten Wert aus einem Array entfernen (bzw. die kleinsten Werte, falls mehrere Zahlen gleichermaßen den kleinsten Wert haben):
PHP-Code
<?php
	$arr = array(99, 7, 19, 37, 64, 6, 87);
	var_dump(array_diff($arr, array(min($arr))));	
?>
Ausgabe
array(6) {
  [0]=>
  int(99)
  [1]=>
  int(7)
  [2]=>
  int(19)
  [3]=>
  int(37)
  [4]=>
  int(64)
  [6]=>
  int(87)
}

3. Alle Werte aus A entfernen, die nicht in B sind (Schnittmenge)


Mit array_intersect($arr1, $arr2 [, $arr3, ...]) kann die Schnittmenge von zwei oder mehr Arrays bestimmt werden:
PHP-Code
<?php
	// Mit diesen Farben könnte sich Anna vorstellen, die Wohnung zu streichen
	$farbenAnna = array('rosa', 'gelb', 'blau', 'rot', 'türkis', 'lila', 'weiß');
	// Mit diesen Farben könnte sich Tom vorstellen, die Wohnung zu streichen
	$farbenTom = array('blau');
	// Farben, die beiden gefallen
	var_dump(array_intersect($farbenAnna, $farbenTom));
?>
Ausgabe
array(1) {
  [2]=>
  string(4) "blau"
}

4. Mit array_filter() einzelne Werte per Callback-Funktion entfernen


Sehr hilfreich beim Löschen von Werten aus Arrays ist die Funktion array_filter($array, $callback). Der Funktion wird ein Array und eine Callback-Funktion übergeben. Der Callback-Funktion wiederum werden durch array_filter() nacheinander alle Werte des Arrays übergeben. Für jeden dieser Werte muss die Funktion entweder true (Wert im Array behalten) oder false (Wert aus Array entfernen) zurückgeben. Das Ergebnis von array_filter() ist das neue Array ohne die laut Callback-Funktion zu löschenden Werte.

Einige festgelegte Werte aus einem Array löschen:
PHP-Code
<?php
	// Um genau festgelegte Werte zu entfernen kann eine eigene Callback-Funktion verwendet werden
	// Hier sollen 1, 5 und 17 entfernt werden
	$arr = array(1, 2, 3, 4, 5, 6);
	$entfernen = array(1, 5, 17);
	$callback = function($value) use ($entfernen) {
		return !(in_array($value, $entfernen, true));
	};
	var_dump($arr);
	var_dump(array_filter($arr, $callback));
?>
Ausgabe
array(6) {
  [0]=>
  int(1)
  [1]=>
  int(2)
  [2]=>
  int(3)
  [3]=>
  int(4)
  [4]=>
  int(5)
  [5]=>
  int(6)
}
array(4) {
  [1]=>
  int(2)
  [2]=>
  int(3)
  [3]=>
  int(4)
  [5]=>
  int(6)
}

Alle Werte entfernen, die keine Integer sind:
PHP-Code
<?php
	$arr = array('eins', 2, 3, 'vier', 'fünf', 6);
	$arr2 = array_filter($arr, 'is_int');
	// es könnte genauso auch folgendes geschrieben werden:
	// $arr2 = array_filter($arr, function($value) { return is_int($value); });
	var_dump($arr);
	var_dump($arr2);
?>
Ausgabe
array(6) {
  [0]=>
  string(4) "eins"
  [1]=>
  int(2)
  [2]=>
  int(3)
  [3]=>
  string(4) "vier"
  [4]=>
  string(4) "fünf"
  [5]=>
  int(6)
}
array(3) {
  [1]=>
  int(2)
  [2]=>
  int(3)
  [5]=>
  int(6)
}

Alle Einträge aus einem Array entfernen, die keine Strings sind:
PHP-Code
<?php
	$arr = array(1, 'zwei', 'drei', 4, 'fünf', '6');
	$arr2 = array_filter($arr, 'is_string');
	var_dump($arr);
	var_dump($arr2);
?>
Ausgabe
array(6) {
  [0]=>
  int(1)
  [1]=>
  string(4) "zwei"
  [2]=>
  string(4) "drei"
  [3]=>
  int(4)
  [4]=>
  string(4) "fünf"
  [5]=>
  string(1) "6"
}
array(4) {
  [1]=>
  string(4) "zwei"
  [2]=>
  string(4) "drei"
  [4]=>
  string(4) "fünf"
  [5]=>
  string(1) "6"
}

Alle Einträge zwischen a und b (jeweils einschließlich; a und b beziehen sich auf die Werte und nicht auf die Schlüssel) entfernen (hier mit a=10 und b=20):
PHP-Code
<?php
	$a = 10;
	$b = 20;
	$arr = array(1, 6, 9, 11, 15, 19, 21, 28, 31);
	$callback = function($value) use ($a, $b) {
		return !($value>=$a && $value<=$b);
	};
	var_dump($arr);
	var_dump(array_filter($arr, $callback));
?>
Ausgabe
array(9) {
  [0]=>
  int(1)
  [1]=>
  int(6)
  [2]=>
  int(9)
  [3]=>
  int(11)
  [4]=>
  int(15)
  [5]=>
  int(19)
  [6]=>
  int(21)
  [7]=>
  int(28)
  [8]=>
  int(31)
}
array(6) {
  [0]=>
  int(1)
  [1]=>
  int(6)
  [2]=>
  int(9)
  [6]=>
  int(21)
  [7]=>
  int(28)
  [8]=>
  int(31)
}

Alle ungeraden Einträge aus einem Array entfernen:
PHP-Code
<?php
	$arr = array(1, 2, 3, 4, 5, 6);
	$callback = function($value) {
		// ergibt true, wenn der Wert gerade ist, sonst false
		return ($value % 2 === 0);
	};
	var_dump($arr);
	var_dump(array_filter($arr, $callback));
?>
Ausgabe
array(6) {
  [0]=>
  int(1)
  [1]=>
  int(2)
  [2]=>
  int(3)
  [3]=>
  int(4)
  [4]=>
  int(5)
  [5]=>
  int(6)
}
array(3) {
  [1]=>
  int(2)
  [3]=>
  int(4)
  [5]=>
  int(6)
}

Alle Einträge aus einem Array entfernen, die leere Strings oder false oder NULL sind
PHP-Code
<?php
	$arr = array(1, 'zwei', '', 'drei', 4, false, 'fünf', '6', null);
	$callback = function($value) {
		return ($value!=='' && $value!==false && $value!==null);
	};
	var_dump($arr);
	var_dump(array_filter($arr, $callback));
?>
Ausgabe
array(9) {
  [0]=>
  int(1)
  [1]=>
  string(4) "zwei"
  [2]=>
  string(0) ""
  [3]=>
  string(4) "drei"
  [4]=>
  int(4)
  [5]=>
  bool(false)
  [6]=>
  string(4) "fünf"
  [7]=>
  string(1) "6"
  [8]=>
  NULL
}
array(6) {
  [0]=>
  int(1)
  [1]=>
  string(4) "zwei"
  [3]=>
  string(4) "drei"
  [4]=>
  int(4)
  [6]=>
  string(4) "fünf"
  [7]=>
  string(1) "6"
}

Wird keine Callback-Funktion an array_filter() übergeben, dann werden alle Werte entfernt, die mit false vergleichbar sind ((bool)false, (int)0, (float)0.0, (string)"", (string)"0").
PHP-Code
<?php
	$arr = array(1, 5, 0, false, 'test', '', null, 0.0);
	var_dump($arr);
	var_dump(array_filter($arr));
?>
Ausgabe
array(8) {
  [0]=>
  int(1)
  [1]=>
  int(5)
  [2]=>
  int(0)
  [3]=>
  bool(false)
  [4]=>
  string(4) "test"
  [5]=>
  string(0) ""
  [6]=>
  NULL
  [7]=>
  float(0)
}
array(3) {
  [0]=>
  int(1)
  [1]=>
  int(5)
  [4]=>
  string(4) "test"
}

5. Beim Iterieren Werte entfernen


Man kann auch einfach per Schleife über das Array iterieren und Werte entfernen, sofern man keine der zuvor genannten PHP-Funktionen verwenden will.

Foreach:
PHP-Code
<?php
	$arr = array(74, 100, 54, 'eins', 12);
	foreach ($arr as $key=>$val) {
		if (!is_int($val)) {
			unset($arr[$key]);
		}
	}
	var_dump($arr);
?>
Ausgabe
array(4) {
  [0]=>
  int(74)
  [1]=>
  int(100)
  [2]=>
  int(54)
  [4]=>
  int(12)
}

For-Schleife:
PHP-Code
<?php
	$arr = array(74, 100, 54, 'eins', 12);
	for ($x=0, $c=count($arr); $x<$c; ++$x) {
		if (!is_int($arr[$x])) {
			unset($arr[$x]);
		}
	}
	var_dump($arr);
?>
Ausgabe
array(4) {
  [0]=>
  int(74)
  [1]=>
  int(100)
  [2]=>
  int(54)
  [4]=>
  int(12)
}

While-Schleife:
PHP-Code
<?php
	$arr = array(74, 100, 54, 'eins', 12);
	while (list($key, $val) = each($arr)) {
		if (!is_int($val)) {
			unset($arr[$key]);
		}
	}
	var_dump($arr);
?>
Ausgabe
array(4) {
  [0]=>
  int(74)
  [1]=>
  int(100)
  [2]=>
  int(54)
  [4]=>
  int(12)
}

6. Schlüssel neu bilden nach Entfernen von Werten


Nachdem ein oder mehrere Werte aus dem Array gelöscht wurden können sich „Lücken” bei den Schlüsseln gebildet haben.
In den zuvor genannten Beispielen für die Schleifen wäre das Array dann zum Beispiel nicht mehr vom Aufbau her
array( 0=>74, 1=>100, 2=>54, 3=>'eins', 4=>12 );
sondern stattdessen
array( 0=>74, 1=>100, 2=>54, 4=>12 );
Entsprechend würde der Schlüssel „3” fehlen.
Sollen die Schlüssel daher neu gebildet werden (zu 0, 1, 2, 3, 4, ...), kann array_values() angewendet werden.
PHP-Code
<?php
	$arr = array( 0=>74, 1=>100, 2=>54, 3=>'eins', 4=>12 );
	unset($arr[3]);
	$arr = array_values($arr);
	var_dump($arr);
?>
Ausgabe
array(4) {
  [0]=>
  int(74)
  [1]=>
  int(100)
  [2]=>
  int(54)
  [3]=>
  int(12)
}

Kommentare (1)

Von neu nach alt
So geht es auch, wenn man ein Wert aus einem Array entfernen möchte:
$arr = array(74, 100, 54, 'eins', 12);
unset($arr[array_search('eins', $arr)]);
Thor Duisenberg (Gast) #