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.
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 !== ''; }));
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);
$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
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');
$myarray = array_filter($myarray, 'strlen'); //removes null values but leaves "0"
$myarray = array_filter($myarray); //removes all null values
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 :)
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:
foreach($linksArray as $key => $link)
{
if($link === '')
{
unset($linksArray[$key]);
}
}
print_r($linksArray);
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.
Dies ist mein vorgeschlagener Code:
$myarray = array_values(array_filter(array_map('trim', $myarray), 'strlen'));
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.
$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"
}
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?
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:
Zunächst müssen wir uns darauf einigen, was empty bedeutet. Wollen Sie herausfiltern:
$element === false
)empty()
-Funktion von PHP?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);
$a = array(1, '', '', '', 2, '', 3, 4);
$b = array_values(array_filter($a));
print_r($b)
Für mehrdimensionales Array
$data = array_map('array_filter', $data);
$data = array_filter($data);
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]);
}
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');
});
$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];
}
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.
Nur eine Zeile: Update (Danke an @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>';
}
Ausgabe
1: 5
2: 6
verwenden Sie die Funktion array_filter
, um leere Werte zu entfernen:
$linksArray = array_filter($linksArray);
print_r($linksArray);
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!
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
);
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);