Cómo filtrar una matriz por una condición
Tengo una matriz como esta:
array("a" => 2, "b" => 4, "c" => 2, "d" => 5, "e" => 6, "f" => 2)
Ahora quiero filtrar esa matriz por alguna condición y solo mantener los elementos donde el valor es igual a 2 y eliminar todos los elementos donde el valor NO es 2.
Entonces mi matriz de resultados esperados sería:
array("a" => 2, "c" => 2, "f" => 2)
Nota: quiero conservar las claves de la matriz original.
¿Cómo puedo hacer eso con PHP? ¿Alguna función integrada?
$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";
}
De alguna manera tienes que recorrer tu matriz y filtrar cada elemento según tu condición. Esto se puede hacer con varios métodos.
Bucles while
// método for
_foreach
Recorra su matriz con cualquier bucle que desee, ya sea while
, for
o foreach
. Luego simplemente verifique su condición y unset()
los elementos si no cumplen con su condición o escriba los elementos que cumplen con la condición en una nueva matriz.
Bucle
//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
}
Condición
Simplemente coloque su condición en el bucle donde //condition
está el comentario. La condición puede simplemente verificar lo que desee y luego puede seleccionar unset()
los elementos que no cumplen con su condición y volver a indexar la matriz array_values()
si lo desea, o escribir los elementos en una nueva matriz que cumpla con la condición.
//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()
método
Otro método es utilizar la array_filter()
función incorporada. Generalmente funciona más o menos igual que el método con un bucle simple.
Solo necesita regresar TRUE
si desea mantener el elemento en la matriz y FALSE
si desea eliminar el elemento de la matriz de resultados.
//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()
método
preg_grep()
es similar a array_filter()
que solo usa expresiones regulares para filtrar la matriz. Por lo que es posible que no puedas hacer todo con él, ya que solo puedes usar una expresión regular como filtro y solo puedes filtrar por valores o con algo más de código por claves.
También tenga en cuenta que puede pasar la bandera PREG_GREP_INVERT
como tercer parámetro para invertir los resultados.
//Filter by values
$newArray = preg_grep("/regex/", $array);
Condiciones comunes
Hay muchas condiciones comunes que se utilizan para filtrar una matriz y todas se pueden aplicar al valor o la clave de la matriz. Sólo enumeraré algunos de ellos aquí:
//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