Pregunta

Tengo una matriz de esta manera:

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

Ahora quiero filtrar esa matriz por alguna condición y sólo mantener los elementos donde el valor es igual a 2 y eliminar todos los elementos en los que el valor no es 2.

Así que mi matriz resultado esperado 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? Cualquier funciones integradas?

¿Fue útil?

Solución

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

Otros consejos

De alguna manera tiene que recorrer la matriz y filtrar cada elemento por su condición. Esto se puede hacer con varios métodos.

Bucles while / for / método foreach

Bucle a través de su matriz con cualquier bucle que desea, que sea while, for o foreach. Después, simplemente comprobar su condición y, o bien unset() los elementos si no se cumplen su condición o escribir los elementos, que cumplen 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
}

Estado

Sólo tiene que colocar su condición al circuito en el que el comentario es //condition. La condición puede comprobar simplemente para lo que quiera y luego se puede ya sea unset() los elementos que no cumplen con su condición, y re-indexar la matriz con array_values() si lo desea, o escribir los elementos de una nueva matriz que cumplen 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 función incorporada array_filter(). Por lo general, funciona más o menos el mismo que el método con un bucle simple.

Sólo tiene que volver TRUE si desea mantener el elemento de la matriz y FALSE si desea colocar el elemento de la matriz resultado.

//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() sólo que sólo utiliza expresión regular para filtrar la matriz. Por lo que podría no ser capaz de hacer cualquier cosa con él, ya que sólo se puede utilizar una expresión regular como filtro y sólo se puede filtrar por valores o con algo más de código de claves.

También tenga en cuenta que puede pasar el PREG_GREP_INVERT marcar como tercer parámetro a invertir los resultados.

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

Condiciones comunes

Hay muchas condiciones comunes que se utilizan para filtrar una matriz de la que todos se pueden aplicar al valor y o la tecla de la matriz. Me limitaré 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

Puede iterar en las copias de las claves para poder utilizar unset() en el bucle:

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

La ventaja de este método es la eficiencia de memoria si la matriz contiene valores grandes -. Que no se dupliquen

Editar Acabo de notar, que en realidad se necesita solamente las teclas que tienen un valor de 2 (que ya conoce el valor):

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

Esto debería funcionar, pero no estoy seguro de qué tan eficiente es como probablemente terminan copiando una gran cantidad de datos.

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

Creo que la función de lectura snappiest, incorporado es: array_intersect ()

Código: ( demostración )

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

Salida:

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

Sólo asegúrese de que usted declara el segundo parámetro como una matriz, ya que es el tipo de valor esperado.

Ahora no hay nada malo en escribir un bucle foreach, o el uso de array_filter(), sólo tienen una sintaxis más prolija.

array_intersect() también es muy fácil de extender (incluya valores "admisibles" adicionales) mediante la adición de más valores a la segunda matriz de parámetros.

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

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

Yo podría hacer algo como:

$newarray = array();
foreach ($jsonarray as $testelement){
    if ($testelement == 2){$newarray[]=$testelement}
}
$result = count($newarray);
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top