Pergunta

Eu tenho uma matriz como este:

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

Agora eu quero filtrar essa matriz por alguma condição e manter apenas os elementos em que o valor é igual a 2 e eliminar todos os elementos em que o valor não é 2.

Então, minha matriz resultado esperado seria:

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

Nota:. Eu quero manter as chaves da matriz original

Como posso fazer isso com PHP? Qualquer built-in funções?

Foi útil?

Solução

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

Outras dicas

Você de alguma forma tem que percorrer a matriz e filtrar cada elemento por sua condição. Isso pode ser feito com vários métodos.

Loops while / for / foreach método

Curva através de sua matriz com qualquer loop que você quer, seja ele while, for ou foreach. Em seguida, basta verificar a sua condição e tanto unset() os elementos se eles não cumprem sua condição ou escrever os elementos, que satisfazem a condição, em uma nova 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
}

Estado

Basta colocar a sua condição para o loop onde o comentário //condition é. A condição pode apenas verificar o que quiser e, em seguida, você pode unset() os elementos que não cumprem a sua condição, e reindexar a matriz com array_values() , se quiser, ou escrever os elementos de uma nova matriz que atendam a condição.

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

Outro método é usar o array_filter() built-in função. Ele geralmente funciona praticamente o mesmo que o método com um laço simples.

Você só precisa TRUE retorno se você quiser manter o elemento na matriz e FALSE se você quer deixar cair o elemento para fora da 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() é semelhante ao array_filter() só que ele só usa expressões regulares para filtrar a matriz. Assim, você pode não ser capaz de fazer tudo com ele, já que você só pode usar uma expressão regular como filtro e você só pode filtrar por valores ou com um pouco mais de código por chaves.

Observe também que você pode passar o PREG_GREP_INVERT marcar como terceiro parâmetro para inverter os resultados.

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

As condições comuns

Existem muitas condições comuns utilizados para filtrar uma matriz dos quais todos podem ser aplicados para o valor e chave ou da matriz. Vou apenas listar alguns deles aqui:

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

Você pode iterar sobre as cópias das chaves para ser capaz de usar unset() no loop:

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

A vantagem deste método é a eficiência da memória se a matriz contém valores grandes -. Eles não são duplicados

Editar eu só notei, que você realmente precisa somente as chaves que têm um valor de 2 (você já sabe o valor):

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

Isso deve funcionar, mas eu não tenho certeza de quão eficiente ele é como você provavelmente acabar copiando um monte de dados.

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

Eu acho que o snappiest, legível built-in função é: array_intersect ()

Código: ( Demonstração )

$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,
)

Apenas certifique-se de declarar o 2º parâmetro como uma matriz porque esse é o tipo de valor esperado.

Agora, não há nada de errado em escrever um loop foreach, ou usando array_filter(), eles só têm um mais detalhado sintaxe.

array_intersect() também é muito fácil de estender (incluir adicional "qualificação" valores), adicionando mais valores para a matriz segundo parâmetro.

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

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

Eu poderia fazer algo como:

$newarray = array();
foreach ($jsonarray as $testelement){
    if ($testelement == 2){$newarray[]=$testelement}
}
$result = count($newarray);
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top