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?

user648198
fonte
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?

Pascal MARTIN
fonte
"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);
  ...
ADFS
fonte
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]);
    }
}
Dejan Marjanović
fonte
7

Você pode usar isso

unset($dataArray['key']);
Anirban Das
fonte
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.

Mikel Annjuk
fonte
1

Experimente isto:

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

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

Alpes
fonte
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;
Nitish Pandey
fonte
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.

Roger Kaplan
fonte
-1

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

Ivan Proskuryakov
fonte
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