PHP: Como remover um elemento específico de uma matriz?

159

Como faço para remover um elemento de uma matriz quando sei o nome dos elementos? por exemplo:

Eu tenho uma matriz:

$array = array('apple', 'orange', 'strawberry', 'blueberry', 'kiwi');

o usuário entra strawberry

strawberry é removido.

Para explicar completamente:

Eu tenho um banco de dados que armazena uma lista de itens separados por vírgula. O código puxa a lista com base na escolha do usuário em que essa opção está localizada. Portanto, se escolherem o morango, o código será puxado em todas as entradas onde o morango estiver localizado e o converterá em uma matriz usando split (). Quero que eles removem os itens escolhidos pelo usuário, para este exemplo morango, da matriz.

dcp3450
fonte
4
Mesma pergunta: stackoverflow.com/questions/7225070/…
trante
1
Outra mesma pergunta: stackoverflow.com/questions/1883421/…
Eric Lavoie
1
mais mesma pergunta: stackoverflow.com/questions/369602/...
Alex

Respostas:

295

Use array_searchpara obter a chave e removê-la com, unsetse encontrada:

if (($key = array_search('strawberry', $array)) !== false) {
    unset($array[$key]);
}

array_searchretorna false ( nulo até o PHP 4.2.0) se nenhum item foi encontrado.

E se pode haver vários itens com o mesmo valor, você pode usar array_keyspara obter as chaves de todos os itens:

foreach (array_keys($array, 'strawberry') as $key) {
    unset($array[$key]);
}
quiabo
fonte
Obtendo um resultado estranho. Usei sua primeira sugestão, pois sempre haverá apenas uma instância. Para testá-lo, simplesmente obtive o valor da chave. Trabalhou. No entanto, ele não está desativado.
dcp3450
1
while (odbc_fetch_row ($ runqueryGetSubmenus)) {$ submenuList = odbc_result ($ runqueryGetSubmenus, "submenus"); $ submenuArray = divisão (',', $ submenuList); if (($ key = array_search ($ name, $ submenuArray))! == false) {desabilitado ($ submenuArray [$ key]); }}
dcp3450
@ dcp3450: E com o que você faz $submenuArray? (Observe que a cada loop $submenuArrayserá sobrescrito.) #
Gumbo
Eu atualizei minha pergunta para melhor explicar. Basicamente, o código percorre as entradas em um banco de dados removendo os itens escolhidos, "morango" neste exemplo. Portanto, o usuário insere uma seleção => o código pesquisa nos submenus e encontra qualquer lista que possua essa opção => transforma essa lista em uma matriz => remove a opção escolhida.
dcp3450
1
Deixa comigo! Eu não estava reescrevendo a nova matriz de volta para o banco de dados. É fácil perder coisas quando você olha o código por tanto tempo.
dcp3450
153

Use array_diff()para solução de 1 linha:

$array = array('apple', 'orange', 'strawberry', 'blueberry', 'kiwi', 'strawberry'); //throw in another 'strawberry' to demonstrate that it removes multiple instances of the string
$array_without_strawberries = array_diff($array, array('strawberry'));
print_r($array_without_strawberries);

... Não há necessidade de funções extras ou loop foreach.

males
fonte
8
Esta solução é muito mais legível do que as principais.
Robbert
Embora se strawberrynão estiver na matriz inicial, ele ficará disponível na $array_without_strawberriesmatriz - código perigoso se você quiser garantir que um determinado elemento não esteja em uma matriz.
31517 Erfan
5
@ Erfan Sua reivindicação está errada. $a = array_diff(array(), array('strawberry'));- $ a é uma matriz vazia.
bancer
1
Você está certo @bancer - eu provavelmente estava pensando em array_intersect ou algo assim.
Erfan
1
array_diff () é mais elegante que a resposta marcada.
Dom DaFonte 25/09
36
if (in_array('strawberry', $array)) 
{
    unset($array[array_search('strawberry',$array)]);
}
John Conde
fonte
2
Você deve testar se o morango está na matriz.
Gumbo
Seguindo o conselho de Gumbo, a resposta modificada inclui a verificação do elemento antes de removê-lo da matriz.
John Conde
2
Lembre-se também de que os índices não são realinhados após a exclusão de um elemento específico. Em outras palavras, a sequência do índice terá lacunas então. Se você excluir 'strawberry' do seu exemplo, 'kiwi' ainda terá o índice 4 e o índice 2 simplesmente desaparecerá. É importante se o seu código depende da integridade da sequência do índice, como por exemplo os loops ($ i = 0; $ i <.., $ i ++).
da
2
Para adicionar ao que o rei das bananas disse, se você deseja reindexar a matriz, simplesmente faça $my_array = array_values($my_array);.
ryeguy
2
Enquanto esta solução estiver correta, ela pesquisará a matriz DUAS VEZES ( in_arraye array_search). Usar o retorno de array_searchcomo na resposta de Gumbo é mais eficaz #
Bogdan D
21

Se você estiver usando uma matriz simples aqui (o que parece ser o caso), você deve usar este código:

if (($key = array_search('strawberry', $array)) !== false) {
    array_splice($array, $key, 1);
}

unset($array[$key]) remove apenas o elemento, mas não reordena a matriz simples.

Supostamente, temos uma matriz e usamos array_splice:

$array = array('apple', 'orange', 'strawberry', 'blueberry', 'kiwi');
array_splice($array, 2, 1);
json_encode($array); 
// yields the array ['apple', 'orange', 'blueberry', 'kiwi']

Comparado ao não configurado:

$array = array('apple', 'orange', 'strawberry', 'blueberry', 'kiwi');
unset($array[2]);
json_encode($array);
// yields an object {"0": "apple", "1": "orange", "3": "blueberry", "4": "kiwi"}

Observe como unset($array[$key])não reordena a matriz.

ericluwj
fonte
Oficialmente unsetnão retorna nada. Portanto, json_encode(unset($array[2]))não é apropriado para uma comparação.
robsch
este é exatamente o que eu preciso, thaks para ericluwj
ana
12

Você pode usar o filtro de matriz para remover os itens por uma condição específica em $v:

$arr = array_filter($arr, function($v){
    return $v != 'some_value';
});
srcspider
fonte
Voto negativo. Essa baixa qualidade (porque é uma resposta apenas de código e fornece um erro de análise) é uma duplicata do método de D.Martin que apenas usa uma função anônima dentro array_filter(). Enquanto eu pessoalmente usaria uma função anônima em minha implementação, acredito que a ação correta no SO seria comentar ou editar a resposta de D.Martin se você deseja fazer um micro aperfeiçoamento para que esta página não fique inchada. Exclua esta resposta duplicada.
Mkmackusa
4

Será assim:

 function rmv_val($var)
 {
     return(!($var == 'strawberry'));
 }

 $array = array('apple', 'orange', 'strawberry', 'blueberry', 'kiwi');

 $array_res = array_filter($array, "rmv_val");
D.Martin
fonte
4

Essa é uma reiteração simples que pode excluir vários valores na matriz.

    // Your array
    $list = array("apple", "orange", "strawberry", "lemon", "banana");

    // Initilize what to delete
    $delete_val = array("orange", "lemon", "banana");

    // Search for the array key and unset   
    foreach($delete_val as $key){
        $keyToDelete = array_search($key, $list);
        unset($list[$keyToDelete]);
    }
mmr
fonte
Este é um substituto ineficiente e feito em casa para o que os desenvolvedores do PHP já criaram array_diff(). Como isso conseguiu três votos positivos. Ninguém deve achar esta resposta útil ou usá-la em seus próprios projetos. Eu recomendo excluir esta resposta - isso serviria para liberar sua conta de uma resposta de baixa qualidade, reduzir o número de respostas nesta página e ganhar um distintivo disciplinado. Adiarei meu voto negativo para que você tenha tempo de excluir e receber uma recompensa.
precisa saber é o seguinte
4

Apenas você pode fazer linha única. Será remover o elemento da matriz


$array=array_diff($array,['strawberry']);

dılo sürücü
fonte
3

Atualmente, estou usando esta função:

function array_delete($del_val, $array) {
    if(is_array($del_val)) {
         foreach ($del_val as $del_key => $del_value) {
            foreach ($array as $key => $value){
                if ($value == $del_value) {
                    unset($array[$key]);
                }
            }
        }
    } else {
        foreach ($array as $key => $value){
            if ($value == $del_val) {
                unset($array[$key]);
            }
        }
    }
    return array_values($array);
}

Você pode inserir uma matriz ou apenas uma string com os elementos que devem ser removidos. Escreva assim:

$detils = array('apple', 'orange', 'strawberry', 'blueberry', 'kiwi');
$detils = array_delete(array('orange', 'apple'), $detils);

OU

$detils = array_delete('orange', $detils);

Também vai reindexá-lo.

jankal
fonte
2
Isso é terrivelmente complicado e maluco. Como isso ganhou 3 votos positivos?!?
Mkmackusa
2

Esta pergunta tem várias respostas, mas quero acrescentar algo mais, porque quando usei unsetou array_difftive vários problemas para brincar com os índices da nova matriz quando o elemento específico foi removido (porque o índice inicial é salvo)

Volto ao exemplo:

$array = array('apple', 'orange', 'strawberry', 'blueberry', 'kiwi');
$array_without_strawberries = array_diff($array, array('strawberry'));

ou

$array = array('apple', 'orange', 'strawberry', 'blueberry', 'kiwi');
unset($array[array_search('strawberry', $array)]);

Se você imprimir o resultado, obterá:

foreach ($array_without_strawberries as $data) {
   print_r($data);
}

Resultado:

> apple
> orange
> blueberry
> kiwi

Mas os índices serão salvos e, assim, você acessará seu elemento como:

$array_without_strawberries[0] > apple
$array_without_strawberries[1] > orange
$array_without_strawberries[3] > blueberry
$array_without_strawberries[4] > kiwi

E assim a matriz final não é re-indexada. Então você precisa adicionar após o unsetou array_diff:

$array_without_strawberries = array_values($array);

Depois disso, sua matriz terá um índice normal:

$array_without_strawberries[0] > apple
$array_without_strawberries[1] > orange
$array_without_strawberries[2] > blueberry
$array_without_strawberries[3] > kiwi

Relacionado a este post: Re-Index Array

insira a descrição da imagem aqui

Espero que ajude

Jordan Montel
fonte
1

Uma abordagem melhor talvez seja manter seus valores como chaves em uma matriz associativa e, em seguida, invocá array_keys()-la quando desejar a matriz real. Dessa forma, você não precisa usar array_searchpara encontrar seu elemento.

jishi
fonte
1
Sua postagem é um comentário, não uma resposta. Exclua e poste sob a própria pergunta.
Mckmackusa
1

A resposta para a exclusão do array PHP por valor (não chave) Fornecida por https://stackoverflow.com/users/924109/rok-kralj

A IMO é a melhor resposta, pois remove e não muda

array_diff( [312, 401, 15, 401, 3], [401] ) // removing 401 returns [312, 15, 3]

Ele generaliza bem, você pode remover quantos elementos quiser ao mesmo tempo, se quiser.

Isenção de responsabilidade: observe que minha solução produz uma nova cópia da matriz, mantendo a antiga intacta, em contraste com a resposta aceita que sofre mutação. Pode ser um pouco mais lento por causa disso.

perseguido
fonte
1

Eu estava procurando a resposta para a mesma pergunta e me deparei com este tópico. Eu vejo duas maneiras principais: a combinação de array_search& unsete o uso de array_diff. À primeira vista, pareceu-me que o primeiro método seria mais rápido, pois não requer a criação de uma matriz adicional (como ao usar array_diff). Mas eu escrevi uma pequena referência e me certifiquei de que o segundo método não fosse apenas mais conciso, mas também mais rápido! Fico feliz em compartilhar isso com você. :)

https://glot.io/snippets/f6ow6biaol

ПЭХАПЭШНИК
fonte
0

Eu preferiria usar array_key_exists para procurar chaves em matrizes como:

Array([0]=>'A',[1]=>'B',['key'=>'value'])

para encontrar o especificado efetivamente, já que array_search e in_array () não funcionam aqui. E remova coisas com unset () .

Eu acho que vai ajudar alguém.

ddsultan
fonte
0

Criar matriz numérica com excluir valor específico da matriz

    <?php
    // create a "numeric" array
    $animals = array('monitor', 'cpu', 'mouse', 'ram', 'wifi', 'usb', 'pendrive');

    //Normarl display
    print_r($animals);
    echo "<br/><br/>";

    //If splice the array
    //array_splice($animals, 2, 2);
    unset($animals[3]); // you can unset the particular value
    print_r($animals);

    ?>

Você pode consultar este link ..

Sashtha Manik
fonte
Voto negativo. A pergunta claramente pede para remover um valor com base no valor (não na chave). Esta resposta é inútil, por favor, apague.
Mkmackusa
0
$remove= "strawberry";
$array = ["apple", "orange", "strawberry", "blueberry", "kiwi"];
foreach ($array as $key => $value) {
        if ($value!=$remove) {
        echo $value.'<br/>';
                continue;
        }
}
Krishna Jonnalagadda
fonte
Essa resposta nem remove a opção necessária.
Nigel Ren
-1

Usando array_seach(), tente o seguinte:

if(($key = array_search($del_val, $messages)) !== false) {
    unset($messages[$key]);
}

array_search()retorna a chave do elemento encontrado, que pode ser usado para remover esse elemento da matriz original usando unset(). Ele retornará FALSEem caso de falha, mas poderá retornar um valor "falsey" em caso de sucesso (sua chave pode ser, 0por exemplo), razão pela qual o !==operador de comparação estrita é usado.

A if()instrução verificará se array_search()um valor retornou e só executará uma ação se tiver retornado.

Ravinder Singh
fonte
3
Voto negativo. Essa é uma duplicata do método Gumbo (atualmente a solução aceita) que foi lançada anos antes da sua. Respostas duplicadas não têm valor e apenas causam inchaço desnecessário na página. Por favor, apague sua resposta. Se você deseja explicar a resposta de Gumbo, fazê-lo com uma edição em sua resposta ou pedir Gumbo para expandir sua própria resposta ..
mickmackusa
-1
unset($array[array_search('strawberry', $array)]);
max li
fonte
2
Voto negativo. O método array_search()- unset()já foi publicado por John Conde anos antes do seu. Respostas duplicadas não têm valor para os leitores e são realmente um inconveniente devido ao tempo perdido ao rolar e ler informações redundantes. Por favor, apague esta resposta.
Mkmackusa
-1
<?php 
$array = array("apple", "orange", "strawberry", "blueberry", "kiwi");
$delete = "strawberry";
$index = array_search($delete, $array);
array_splice($array, $index, 1);
var_dump($array);
?>
Onome Mine Adamu
fonte
2
Você pode melhorar essa resposta escrevendo uma ou duas frases sobre a) o que o código faz eb) por que você acha que é uma opção entre todas as outras respostas.
22617 Robin
-1
foreach ($get_dept as $key5 => $dept_value) {
                if ($request->role_id == 5 || $request->role_id == 6){
                    array_splice($get_dept, $key5, 1);
                }
            }
Rajendra Rajput
fonte
4
Além da resposta que você forneceu, considere fornecer uma breve explicação de por que e como isso resolve o problema.
Jtate # 15/19
-2
$detils = array('apple', 'orange', 'strawberry', 'blueberry', 'kiwi');
     function remove_embpty($values)
     {
        if($values=='orange')
        {
            $values='any name';
        }
        return $values;
     }
     $detils=array_map('remove_embpty',$detils);
    print_r($detils);
user3296940
fonte
2
Por favor, também adicione explicações. Como isso resolve o problema.
Rahil Wazir
sua resposta substituir um elemento da matriz para outra NO para remover um elemento
Ahmed Hamdy
Voto negativo. Esta resposta não fornece a saída esperada. Exclua esta resposta incorreta.
Mkmackusa