Eu tenho uma matriz PHP da seguinte maneira:
$messages = [312, 401, 1599, 3, ...];
Quero excluir o elemento que contém o valor $del_val
(por exemplo $del_val=401
), mas não sei sua chave. Isso pode ajudar: cada valor pode estar lá apenas uma vez .
Estou procurando a função mais simples para executar esta tarefa, por favor.
Respostas:
Usando
array_search()
eunset
, tente o seguinte:array_search()
retorna a chave do elemento encontrado, que pode ser usado para remover esse elemento da matriz original usandounset()
. Ele retornaráFALSE
em caso de falha, mas poderá retornar um valor falso-y em caso de sucesso (sua chave pode ser,0
por exemplo), razão pela qual o!==
operador de comparação estrita é usado.A
if()
instrução verificará searray_search()
um valor retornou e só executará uma ação se o fizer.fonte
array_diff()
seria mais lento, como é comparar duas matrizes, e não simplesmente pesquisar através de um comoarray_search()
.$key
for0
?0
ou qualquer outro valor falsey, ele não desmarca o valor e seu código não funciona. Você deveria testar$key === false
. (edit- você conseguiu)Bem, excluir um elemento da matriz é basicamente definir a diferença com um elemento.
Ele generaliza bem, você pode remover quantos elementos quiser ao mesmo tempo, se desejar.
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. Escolha o que você precisa.
fonte
[$element]
que useiarray($element)
. Nada demais, mas alguém só queria que tinha um problema semelhante para saber que eles não estavam sozinhosarray_diff
usa(string) $elem1 === (string) $elem2
como sua condição de igualdade, não$elem1 === $elem2
como você poderia esperar. A questão apontada por @ nischayn22 é uma consequência disso. Se você deseja que algo use como uma função utilitária que funcione para matrizes de elementos arbitrários (que podem ser objetos), a resposta do Bojangle pode ser melhor por esse motivo.array_diff()
e, portanto, estimula o tempo de execução até O (n lg n) de O (n).Uma maneira interessante é usar
array_keys()
:A
array_keys()
função utiliza dois parâmetros adicionais para retornar apenas chaves para um valor específico e se é necessária uma verificação rigorosa (por exemplo, usando === para comparação).Isso também pode remover vários itens da matriz com o mesmo valor (por exemplo
[1, 2, 3, 3, 4]
).fonte
array_values()
também; as chaves restantes ainda estão na mesma ordem, porém, assim tecnicamente não é "indiferenciados"Se você souber com certeza que sua matriz conterá apenas um elemento com esse valor, poderá fazer
Se, no entanto, seu valor puder ocorrer mais de uma vez em sua matriz, você poderá fazer isso
Nota: A segunda opção funciona apenas para PHP5.3 + com Closures
fonte
fonte
Veja o seguinte código:
Você pode fazer:
E isso lhe dará essa matriz:
fonte
A melhor maneira é
array_splice
Razão para Melhor está aqui em http://www.programmerinterview.com/index.php/php-questions/how-to-delete-an-element-from-an-array-in-php/
fonte
[1, 2, 4 => 3]
.3
, a matriz será[1, 2, 3]
; em outras palavras, o valor não foi removido. Para ser claro, não estou dizendo que falha em todos os cenários, apenas neste.Ou simplesmente, de maneira manual:
Este é o mais seguro deles, porque você tem controle total sobre sua matriz
fonte
array_splice()
vez deunset()
reordenará os índices da matriz também, o que poderia ser melhor nesse caso.Pelo código a seguir, os valores repetitivos serão removidos das $ messages.
$messages = array_diff($messages, array(401));
fonte
Se você possui PHP
5.3+
, existe o código de uma linha:fonte
$value
, então realmente tem que ser colocado em uma mini-aula, assim você pode acessar$value
dentro do fechamento ....Resultado
Array ( [0] => 312 [1] => 1599 [2] => 3 )
fonte
você pode fazer:
Explicação : Exclua o elemento que possui a chave
401
depois de virar a matriz.fonte
401
?Para excluir vários valores, tente este:
fonte
Emprestou a lógica de underscore.JS _.reject e criou duas funções (as pessoas preferem funções !!)
array_reject_value: Esta função está simplesmente rejeitando o valor especificado (também funciona para PHP4,5,7)
array_reject: Esta função está simplesmente rejeitando o método que pode ser chamado (funciona para PHP> = 5.3)
Portanto, em nosso exemplo atual, podemos usar as funções acima, da seguinte maneira:
ou ainda melhor: (como isso nos dá uma sintaxe melhor para usar como a matriz array_filter )
O exemplo acima pode ser usado para coisas mais complicadas, como, digamos, que gostaríamos de remover todos os valores maiores ou iguais a 401. Podemos simplesmente fazer o seguinte:
fonte
Tente isso, esta é a melhor e mais rápida maneira de remover elemento por valor
fonte
A resposta @Bojangles me ajudou. Obrigado.
No meu caso, a matriz pode ser associativa ou não, então eu adicionei a seguinte função
Saudações
fonte
código de liner único (graças a array_diff () ), use o seguinte:
fonte
A resposta aceita converte a matriz em matriz associativa; portanto, se você deseja mantê-la como uma matriz não associativa com a resposta aceita, talvez seja necessário usar
array_values
também.A referência está aqui
fonte
Conforme sua exigência " cada valor pode estar lá apenas uma vez " se você estiver apenas interessado em manter valores exclusivos em sua matriz, então
array_unique()
pode ser o que você está procurando.Entrada:
Resultado:
fonte
Se os valores que você deseja excluir estiverem ou puderem estar em uma matriz. Use o array_diff função . Parece funcionar muito bem para coisas assim.
array_diff
fonte
Sei que isso não é nada eficiente, mas é simples, intuitivo e fácil de ler.
Portanto, se alguém está procurando uma solução não tão sofisticada que possa ser estendida para trabalhar com mais valores ou condições mais específicas ... aqui está um código simples:
fonte
Obtenha a chave da matriz com
array_search()
.fonte
Se você não conhece sua chave, significa que não importa.
Você pode colocar o valor como chave, significa que ele encontrará o valor instantaneamente. Melhor do que usar a pesquisa em todos os elementos repetidamente.
fonte
Uma linha única usando o
or
operador:fonte
você pode consultar este URL : para função
Então a saída deve ser,
fonte
Outra idéia para excluir o valor de uma matriz, use array_diff. Se eu quero
(Doc: http://php.net/manual/fr/function.array-diff.php )
fonte
Eu acho que a maneira mais simples seria usar uma função com um loop foreach:
A saída será:
fonte
Com o PHP 7.4 usando funções de seta:
Para manter uma matriz não associativa, envolva-a com
array_values()
:fonte