PHP Remove os elementos do array associativo


100

Eu tenho uma matriz PHP que se parece com isto:

Index              Key     Value
[0]                1       Awaiting for Confirmation
[1]                2       Assigned
[2]                3       In Progress
[3]                4       Completed
[4]                5       Mark As Spam

Quando var_dump os valores do array, obtenho o seguinte:

array(5) { [0]=> array(2) { ["key"]=> string(1) "1" ["value"]=> string(25) "Awaiting for Confirmation" } [1]=> array(2) { ["key"]=> string(1) "2" ["value"]=> string(9) "Assigned" } [2]=> array(2) { ["key"]=> string(1) "3" ["value"]=> string(11) "In Progress" } [3]=> array(2) { ["key"]=> string(1) "4" ["value"]=> string(9) "Completed" } [4]=> array(2) { ["key"]=> string(1) "5" ["value"]=> string(12) "Mark As Spam" } }

Queria remover Concluído e Marcar como spam . Eu sei que posso unset[$array[3],$array[4]), mas o problema é que às vezes o número do índice pode ser diferente.

Existe uma maneira de removê-los combinando o nome do valor em vez do valor da chave?


não tenho certeza se entendi a questão em questão aqui? O que você quer dizer com às vezes o número do índice pode ser diferente?
Simon H

Respostas:


153

Seu array é um tanto estranho: por que não usar apenas o keyíndice as e as value... o valor?

Não seria muito mais fácil se seu array fosse declarado assim:

$array = array(
    1 => 'Awaiting for Confirmation', 
    2 => 'Asssigned', 
    3 => 'In Progress', 
    4 => 'Completed', 
    5 => 'Mark As Spam', 
);

Isso permitiria a você usar seus valores de keycomo índices para acessar a matriz ...

E você seria capaz de usar funções para pesquisar os valores, como array_search():

$indexCompleted = array_search('Completed', $array);
unset($array[$indexCompleted]);

$indexSpam = array_search('Mark As Spam', $array);
unset($array[$indexSpam]);

var_dump($array);

Mais fácil do que com seu array, não?



Em vez disso, com sua matriz semelhante a esta:

$array = array(
    array('key' => 1, 'value' => 'Awaiting for Confirmation'), 
    array('key' => 2, 'value' => 'Asssigned'), 
    array('key' => 3, 'value' => 'In Progress'), 
    array('key' => 4, 'value' => 'Completed'), 
    array('key' => 5, 'value' => 'Mark As Spam'), 
);

Você terá que percorrer todos os itens para analisar valuee remover a configuração dos itens certos:

foreach ($array as $index => $data) {
    if ($data['value'] == 'Completed' || $data['value'] == 'Mark As Spam') {
        unset($array[$index]);
    }
}
var_dump($array);

Mesmo se possível, não é tão simples ... e eu insisto: você não pode mudar o formato do seu array, para trabalhar com um sistema de chave / valor mais simples?


"Você terá que percorrer todos os itens, para analisar o valor". Ao usar array_search, você também pode pesquisar todos os itens.
Nicolas Aoki

96
  ...

  $array = array(
      1 => 'Awaiting for Confirmation', 
      2 => 'Asssigned', 
      3 => 'In Progress', 
      4 => 'Completed', 
      5 => 'Mark As Spam', 
  );



  return array_values($array);
  ...

3
Obrigado, eu estava procurando apenas por isso.! :)
Ravi Dhoriya ツ

2
Legal e fácil . apenas procurando por isso
Faisal Mehmood Awan

Esta é a resposta verdadeira, não foi verificada.
A.Seddighi de

16
$key = array_search("Mark As Spam", $array);
unset($array[$key]);

Para matrizes 2D ...

$remove = array("Mark As Spam", "Completed");
foreach($arrays as $array){
    foreach($array as $key => $value){
        if(in_array($value, $remove)) unset($array[$key]);
    }
}


3

Por que não use array_diff?

$array = array(
    1 => 'Awaiting for Confirmation', 
    2 => 'Asssigned', 
    3 => 'In Progress', 
    4 => 'Completed', 
    5 => 'Mark As Spam', 
);
$to_delete = array('Completed', 'Mark As Spam');
$array = array_diff($array, $to_delete);

Apenas observe que sua matriz seria reindexada.


1

Experimente isto:

$keys = array_keys($array, "Completed");

/ edit Conforme mencionado por JohnP, este método funciona apenas para matrizes não aninhadas.


0

A maneira de fazer isso é pegar seu array de destino aninhado e copiá-lo em uma única etapa para um array não aninhado. Exclua a (s) chave (s) e atribua a matriz aparada final ao nó aninhado da matriz anterior. Aqui está um código para simplificar:

$temp_array = $list['resultset'][0];

unset($temp_array['badkey1']);
unset($temp_array['badkey2']);

$list['resultset'][0] = $temp_array;

0

Eu meio que discordo da resposta aceita. Às vezes, uma arquitetura de aplicativo não quer que você mexa com a id do array ou o torna inconveniente. Por exemplo, eu uso bastante o CakePHP, e uma consulta ao banco de dados retorna a chave primária como um valor em cada registro, muito semelhante ao anterior.

Supondo que a matriz não seja estupidamente grande, eu usaria array_filter. Isso criará uma cópia da matriz, menos os registros que deseja remover, que você pode atribuir de volta à variável da matriz original.

Embora isso possa parecer ineficiente, está na verdade muito em voga hoje em dia ter variáveis ​​imutáveis, e o fato de que a maioria das funções de array php retornam um novo array em vez de interferir no original implica que o PHP meio que quer que você faça isso também. E quanto mais você trabalha com arrays e percebe o quão difícil e irritante é a função unset (), essa abordagem faz muito sentido.

De qualquer forma:

$my_array = array_filter($my_array, 
                         function($el) { 
                            return $el["value"]!="Completed" && $el!["value"]!="Marked as Spam"; 
                         });

Você pode usar qualquer lógica de inclusão (por exemplo, seu campo de id) na função incorporada que você deseja.


-1

para uso de item de matriz única reset($item)


A função de redefinição deve ser usada para mover o ponteiro interno do array, não para remover itens ou cancelar a definição de itens de um array. Em vez disso, use não definido. Se sua solução funcionar, ela também terá efeitos colaterais indesejados.
David
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.