Cómo filtrar una matriz por una condición

Resuelto menardmam asked hace 54 años • 9 respuestas

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?

menardmam avatar Jan 01 '70 08:01 menardmam
Aceptado
$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";
}
Simon avatar Oct 01 '2009 12:10 Simon

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, foro 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 //conditionestá 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 TRUEsi desea mantener el elemento en la matriz y FALSEsi 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_INVERTcomo 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
Gumbo avatar Oct 01 '2009 12:10 Gumbo