php - ejemplo - Cómo filtrar una matriz por una condición
in array php (7)
Esto debería funcionar, pero no estoy seguro de lo eficiente que es, ya que probablemente termine copiando una gran cantidad de datos.
$newArray = array_intersect_key(
$fullarray,
array_flip(array_keys($fullarray, 2))
);
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 mantener las claves de la matriz original.
¿Cómo puedo hacer eso con PHP? ¿Alguna función incorporada?
Podría hacer algo como:
$newarray = array();
foreach ($jsonarray as $testelement){
if ($testelement == 2){$newarray[]=$testelement}
}
$result = count($newarray);
Puede repetir las copias de las claves para poder usar unset()
en el ciclo:
foreach (array_keys($array) as $key) {
if ($array[$key] != 2) {
unset($array[$key]);
}
}
La ventaja de este método es la eficiencia de la memoria si su matriz contiene grandes valores, no están duplicados.
EDIT Me di cuenta de que solo necesitas las claves que tienen un valor de 2 (ya conoces el valor):
$keys = array();
foreach ($array as $key => $value) {
if ($value == 2) {
$keys[] = $key;
}
}
Vea el ejemplo en la página array_filter
.
foreach ($aray as $key => $value) {
if (2 != $value) {
unset($array($key));
}
}
echo ''Items in array:'' . count($array);
$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 tiene que recorrer su matriz y filtrar cada elemento según su condición. Esto se puede hacer con varios métodos.
Bucles while
/ for
/ foreach
method
Haz un bucle a través de tu matriz con cualquier loop que desees, 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 la condición, en una nueva matriz.
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
}
Condición
Simplemente coloque su condición en el bucle donde está la //condition
comentario //condition
. La condición solo puede verificar lo que desee y luego puede unset()
los elementos que no cumplen con su condición, y reindexar la matriz con array_values()
si lo desea, o escribir los elementos en una nueva matriz que cumple con los requisitos 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
}
método array_filter()
Otro método es usar la array_filter()
incorporada array_filter()
. Por lo general, funciona más o menos igual que el método con un bucle simple.
Solo necesita devolver 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);
método preg_grep()
preg_grep()
es similar a array_filter()
solo que usa expresiones regulares para filtrar la matriz. Por lo tanto, es posible que no pueda hacer todo con él, ya que solo puede usar una expresión regular como filtro y solo puede filtrar por valores o con más código por claves.
También tenga en cuenta que puede pasar el indicador 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 y a la tecla de la matriz. Voy a 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