Domanda

Ho un array come questo:

array("a" => 2, "b" => 4, "c" => 2, "d" => 5, "e" => 6, "f" => 2)

Ora voglio filtrare quella matrice da qualche condizione e mantenere solo gli elementi in cui il valore è pari a 2 ed eliminare tutti gli elementi in cui il valore non è 2.

Quindi il mio allineamento risultato atteso sarebbe:

array("a" => 2, "c" => 2, "f" => 2)

Nota: Voglio mantenere le chiavi dalla matrice originale

.

Come posso farlo con PHP? Qualsiasi funzioni built-in?

È stato utile?

Soluzione

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

Altri suggerimenti

È in qualche modo necessario scorrere l'array e filtrare ogni elemento per la sua condizione. Questo può essere fatto con vari metodi.

while / for / metodo foreach

Loop attraverso il vostro array con qualsiasi ciclo che si desidera, può essere while, for o foreach. Poi basta controllare la vostra condizione e sia unset() gli elementi se non soddisfano la sua condizione o scrivere gli elementi, che soddisfano la condizione, in un nuovo 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
}

Condizione

È sufficiente posizionare la sua condizione nel ciclo in cui il commento è //condition. La condizione può solo verificare la presenza di quello che vuoi e poi si può sia unset() gli elementi che non soddisfano la sua condizione, e reindicizzare l'array con array_values() se si vuole, o scrivere gli elementi in un nuovo array che soddisfano la condizione.

//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() metodo

Un altro metodo è quello di utilizzare la funzione built-in array_filter(). Funziona in genere più o meno lo stesso del metodo con un semplice ciclo.

Hai solo bisogno di tornare TRUE se si desidera mantenere l'elemento della matrice e FALSE se si vuole far cadere l'elemento di matrice risultato.

//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() metodo

preg_grep() è simile a array_filter() solo che utilizza solo espressioni regolari per filtrare l'array. Così si potrebbe non essere in grado di fare tutto con esso, dal momento che è possibile utilizzare solo un'espressione regolare come filtro e si può filtrare solo da valori o con un po 'di codice con i tasti.

Si noti inoltre che è possibile passare la PREG_GREP_INVERT segnala come terzo parametro per invertire i risultati.

//Filter by values
$newArray = preg_grep("/regex/", $array);

condizioni comuni

Ci sono molte condizioni comuni usati per filtrare una matrice di che tutto può essere applicata al valore eo chiave dell'array. Mi limito a elencare alcuni di loro qui:

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

È possibile eseguire iterazioni sulle copie delle chiavi per essere in grado di utilizzare unset() nel ciclo:

foreach (array_keys($array) as $key) {
    if ($array[$key] != 2)  {
        unset($array[$key]);
    }
}

Il vantaggio di questo metodo è l'efficienza della memoria se la matrice contiene grandi valori -. Non sono duplicati

Modifica ho appena notato, che è in realtà solo bisogno le chiavi che hanno un valore di 2 (si conosce già il valore):

$keys = array();
foreach ($array as $key => $value) {
    if ($value == 2)  {
        $keys[] = $key;
    }
}

Questo dovrebbe funzionare, ma non sono sicuro di come efficiente è come probabilmente si finisce per la copia di grandi quantità di dati.

$newArray = array_intersect_key(
                  $fullarray, 
                  array_flip(array_keys($fullarray, 2))
            );

Credo che il, leggibile funzione di snappiest built-in è: array_intersect ()

Codice: ( Demo )

$array = array("a" => 2, "b" => 4, "c" => 2, "d" => 5, "e" => 6, "f" => 2);
var_export(array_intersect($array, [2]));

Output:

array (
  'a' => 2,
  'c' => 2,
  'f' => 2,
)

Basta fare in modo di dichiarare il secondo parametro come una matrice, poiché questo è il tipo di valore atteso.

Ora non c'è niente di sbagliato con la scrittura di un ciclo foreach, o utilizzando array_filter(), hanno solo una sintassi più prolisso.

array_intersect() è anche molto facile da estendere (includere i valori aggiuntivi "qualificanti") con l'aggiunta di più valori per il 2 ° matrice di parametri.

  foreach ($aray as $key => $value) {
    if (2 != $value) {
      unset($array($key));
    }
  }

  echo 'Items in array:' . count($array);

potrei fare qualcosa di simile:

$newarray = array();
foreach ($jsonarray as $testelement){
    if ($testelement == 2){$newarray[]=$testelement}
}
$result = count($newarray);
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top