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?

War es hilfreich?

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);
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top