Wie durch eine Bedingung ein Array filtern
-
19-09-2019 - |
Frage
Ich habe ein Array wie folgt:
array("a" => 2, "b" => 4, "c" => 2, "d" => 5, "e" => 6, "f" => 2)
Jetzt möchte ich von einer Bedingung, dass die Array filtern und nur die Elemente halten, wenn der Wert gleich 2 ist und alle Elemente löschen, wenn der Wert nicht 2 ist.
Also mein erwartetes Ergebnis Array wäre:
array("a" => 2, "c" => 2, "f" => 2)
Hinweis: Ich möchte aus dem ursprünglichen Array die Schlüssel halten
.Wie kann ich das mit PHP? Alle integrierten Funktionen?
Lösung
$fullarray = array('a'=>2,'b'=>4,'c'=>2,'d'=>5,'e'=>6,'f'=>2);
function filterArray($value){
return ($value == 2);
}
$filteredArray = array_filter($fullArray, 'filterArray');
foreach($filteredArray as $k => $v){
echo "$k = $v";
}
Andere Tipps
Sie haben irgendwie durch das Array Schleife und filtern jedes Element von Ihrem Zustand. Dies kann mit verschiedenen Methoden erfolgen.
Loops while
/ for
/ foreach
Methode
Schleife durch das Array mit einer beliebigen Schleife Sie wollen, kann es while
, for
oder foreach
werden. Dann einfach für Ihren Zustand überprüfen und entweder unset()
die Elemente, wenn sie nicht erfüllen Ihr Zustand oder die Elemente schreiben, die die Bedingung erfüllen, in ein neues Array.
Looping
//while loop
while(list($key, $value) = each($array)){
//condition
}
//for loop
$keys = array_keys($array);
for($counter = 0, $length = count($array); $counter < $length; $counter++){
$key = $keys[$counter];
$value = $array[$key];
//condition
}
//foreach loop
foreach($array as $key => $value){
//condition
}
Bedingung
Legen Sie einfach Ihren Zustand in die Schleife, wo der Kommentar //condition
ist. Der Zustand kann nur überprüfen, was Sie wollen, und dann können Sie entweder die Elemente unset()
, die Ihren Zustand nicht erfüllen, und indiziert das Array mit array_values()
, wenn Sie wollen, oder die Elemente in einem neuen Array schreiben, die die Bedingung erfüllen.
//Pseudo code
//Use one of the two ways
if(condition){ //1. Condition fulfilled
$newArray[ ] = $value;
//↑ Put '$key' there, if you want to keep the original keys
//Result array is: $newArray
} else { //2. Condition NOT fulfilled
unset($array[$key]);
//Use array_values() after the loop if you want to reindex the array
//Result array is: $array
}
array_filter()
Methode
Eine andere Methode ist die array_filter()
integrierte Funktion nutzen zu können. Es funktioniert im Allgemeinen so ziemlich das gleiche wie das Verfahren mit einer einfachen Schleife.
Sie müssen nur TRUE
zurück, wenn Sie das Element in dem Array und FALSE
behalten möchten, wenn Sie das Element aus dem Ergebnis-Array löschen möchten.
//Anonymous function
$newArray = array_filter($array, function($value, $key){
//condition
}, ARRAY_FILTER_USE_BOTH);
//Function name passed as string
function filter($value, $key){
//condition
}
$newArray = array_filter($array, "filter", ARRAY_FILTER_USE_BOTH);
//'create_function()', NOT recommended
$newArray = array_filter($array, create_function('$value, $key', '/* condition */'), ARRAY_FILTER_USE_BOTH);
preg_grep()
Methode
preg_grep()
ist ähnlich array_filter()
nur, dass es nur für reguläre Ausdrücke verwendet das Array zu filtern. So könnten Sie nicht in der Lage sein, alles zu tun, damit, da man nur einen regulären Ausdruck als Filter verwenden kann, und Sie können nur von Werten oder mit etwas mehr Code von Tasten filtern.
Beachten Sie auch, dass Sie die Flagge PREG_GREP_INVERT
als dritter Parameter übergeben kann, die Ergebnisse zu invertieren.
//Filter by values
$newArray = preg_grep("/regex/", $array);
Allgemeine Bedingungen
Es gibt viele gemeinsame Bedingungen verwendet eine Anordnung zum Filtern von denen alle auf den Wert angewendet werden kann, und oder Schlüssel des Arrays. Ich werde nur ein paar von ihnen Liste hier:
//Odd values
return $value & 1;
//Even values
return !($value & 1);
//NOT null values
return !is_null($value);
//NOT 0 values
return $value !== 0;
//Contain certain value values
return strpos($value, $needle) !== FALSE; //Use 'use($needle)' to get the var into scope
//Contain certain substring at position values
return substr($value, $position, $length) === $subString;
//NOT 'empty'(link) values
array_filter($array); //Leave out the callback parameter
Sie können auf den Kopien der Schlüssel iterieren können unset()
in der Schleife verwenden:
foreach (array_keys($array) as $key) {
if ($array[$key] != 2) {
unset($array[$key]);
}
}
Der Vorteil dieser Methode ist, die Speichereffizienz, wenn Ihr Array große Werte enthält -. Sie nicht dupliziert werden
Bearbeiten Ich habe gerade bemerkt, dass man eigentlich nur die Schlüssel benötigt, die einen Wert von 2 haben (Sie bereits den Wert kennen):
$keys = array();
foreach ($array as $key => $value) {
if ($value == 2) {
$keys[] = $key;
}
}
Das sollte funktionieren, aber ich bin mir nicht sicher, wie effizient es ist, wie Sie wahrscheinlich eine Menge von Daten am Ende zu kopieren.
$newArray = array_intersect_key(
$fullarray,
array_flip(array_keys($fullarray, 2))
);
Ich denke, die bissigste, gut lesbare integrierte Funktion ist: array_intersect ()
Code: ( Demo )
$array = array("a" => 2, "b" => 4, "c" => 2, "d" => 5, "e" => 6, "f" => 2);
var_export(array_intersect($array, [2]));
Ausgabe:
array (
'a' => 2,
'c' => 2,
'f' => 2,
)
So stellen Sie sicher, dass Sie den zweiten Parameter als ein Array deklarieren, da der Wert Typ erwartet wird.
Jetzt gibt es nichts falsch mit einer foreach-Schleife auszuschreiben oder mit array_filter()
sie nur eine ausführlichere Syntax haben.
array_intersect()
ist auch sehr einfach (zusätzlicher „Qualifikation“ Wert) zu erweitern, indem mehrere Werte zum zweiten Parameter-Array hinzugefügt wird.
foreach ($aray as $key => $value) {
if (2 != $value) {
unset($array($key));
}
}
echo 'Items in array:' . count($array);
ich könnte etwas tun:
$newarray = array();
foreach ($jsonarray as $testelement){
if ($testelement == 2){$newarray[]=$testelement}
}
$result = count($newarray);