Tengo una matriz PHP de la siguiente manera:
$messages = [312, 401, 1599, 3, ...];
Quiero eliminar el elemento que contiene el valor $del_val
(por ejemplo, $del_val=401
), pero no sé su clave. Esto podría ayudar: cada valor solo puede estar allí una vez .
Estoy buscando la función más simple para realizar esta tarea, por favor.
Respuestas:
Usando
array_search()
yunset
, intente lo siguiente:array_search()
devuelve la clave del elemento que encuentra, que puede usarse para eliminar ese elemento de la matriz original usandounset()
. VolveráFALSE
en caso de falla, sin embargo, puede devolver un valor falso y en caso de éxito (su clave puede ser,0
por ejemplo), razón por la cual se utiliza el!==
operador de comparación estricto .La
if()
declaración verificará siarray_search()
devolvió un valor y solo realizará una acción si lo hizo.fuente
array_diff()
sería más lenta, ya que está comparando dos matrices, no simplemente buscar a través de uno comoarray_search()
.$key
es así0
?0
o cualquier otro valor de falsey, no lo desarmará y su código no funcionará. Deberías probarlo$key === false
. (edit- lo tienes)Bueno, eliminar un elemento de la matriz es básicamente establecer la diferencia con un elemento.
Se generaliza muy bien, puede eliminar tantos elementos como desee al mismo tiempo, si lo desea.
Descargo de responsabilidad: tenga en cuenta que mi solución produce una nueva copia de la matriz mientras mantiene intacta la anterior en contraste con la respuesta aceptada que muta. Elige el que necesitas.
fuente
[$element]
que en suarray($element)
lugar lo usé . No es gran cosa, pero solo quería que cualquiera que tuviera un problema similar supiera que no estaban solosarray_diff
usa(string) $elem1 === (string) $elem2
como su condición de igualdad, no$elem1 === $elem2
como se podría esperar. El problema señalado por @ nischayn22 es una consecuencia de esto. Si desea que algo se use como una función de utilidad que funcione para conjuntos de elementos arbitrarios (que podrían ser objetos), la respuesta de Bojangle podría ser mejor por este motivo.array_diff()
y, por lo tanto, empuja el tiempo de ejecución hasta O (n lg n) desde O (n).Una forma interesante es mediante el uso de
array_keys()
:La
array_keys()
función toma dos parámetros adicionales para devolver solo claves para un valor particular y si se requiere una verificación estricta (es decir, usar === para la comparación).Esto también puede eliminar múltiples elementos de la matriz con el mismo valor (por ejemplo
[1, 2, 3, 3, 4]
).fuente
array_values()
; las teclas restantes todavía están en el mismo orden, así que técnicamente no está "sin clasificar"Si sabe con certeza que su matriz contendrá solo un elemento con ese valor, puede hacer
Sin embargo, si su valor puede aparecer más de una vez en su matriz, puede hacer esto
Nota: La segunda opción solo funciona para PHP5.3 + con cierres
fuente
fuente
Echa un vistazo al siguiente código:
Tu puedes hacer:
Y eso te dará esta matriz:
fuente
La mejor manera es
array_splice
Reason for Best está aquí en http://www.programmerinterview.com/index.php/php-questions/how-to-delete-an-element-from-an-array-in-php/
fuente
[1, 2, 4 => 3]
.3
, la matriz será[1, 2, 3]
; en otras palabras, el valor no fue eliminado. Para ser claros, no digo que falle en todos los escenarios, solo en este.O simplemente, de forma manual:
Este es el más seguro de ellos porque tienes control total sobre tu matriz
fuente
array_splice()
lugar deunset()
reordenará los índices de matriz también, lo que podría ser mejor en este caso.Mediante el siguiente código, los valores repetitivos se eliminarán de los mensajes $.
$messages = array_diff($messages, array(401));
fuente
Si tiene PHP
5.3+
, existe el código de una línea:fuente
$value
, por lo que realmente debe colocarse en una mini clase para que pueda acceder$value
dentro del cierre ...Salida
Array ( [0] => 312 [1] => 1599 [2] => 3 )
fuente
tu puedes hacer:
Explicación : elimine el elemento que tiene la clave
401
después de voltear la matriz.fuente
401
?Para eliminar varios valores, pruebe este:
fuente
Tomó prestada la lógica de subrayar.JS _.reject y creó dos funciones (¡la gente prefiere las funciones!)
array_reject_value: esta función simplemente rechaza el valor especificado (también funciona para PHP4,5,7)
array_reject: esta función simplemente rechaza el método invocable (funciona para PHP> = 5.3)
Entonces, en nuestro ejemplo actual, podemos usar las funciones anteriores de la siguiente manera:
o incluso mejor: (ya que esto nos da una mejor sintaxis para usar como el array_filter )
Lo anterior se puede usar para cosas más complicadas, como digamos que nos gustaría eliminar todos los valores que son mayores o iguales a 401, simplemente podríamos hacer esto:
fuente
Pruebe esto, esta es la mejor y más rápida forma de eliminar elementos por valor
fuente
La respuesta de @Bojangles me ayudó. Gracias.
En mi caso, la matriz podría ser asociativa o no, así que agregué la siguiente función
Saludos
fuente
código de línea único (gracias a array_diff () ), use lo siguiente:
fuente
La respuesta aceptada convierte la matriz en una matriz asociativa, por lo tanto, si desea mantenerla como una matriz no asociativa con la respuesta aceptada, es posible que también deba usarla
array_values
.La referencia está aquí
fuente
Según su requisito, " cada valor solo puede estar allí por una vez " si solo está interesado en mantener valores únicos en su matriz, entonces el
array_unique()
podría ser lo que está buscando.Entrada:
Resultado:
fuente
Si los valores que desea eliminar están o pueden estar en una matriz. Use la función array_diff . Parece funcionar muy bien para cosas como esta.
array_diff
fuente
Sé que esto no es eficiente en absoluto, pero es simple, intuitivo y fácil de leer.
Entonces, si alguien está buscando una solución no tan elegante que se pueda extender para trabajar con más valores o condiciones más específicas ... aquí hay un código simple:
fuente
Obtenga la clave de matriz con
array_search()
.fuente
Si no conoce su clave, significa que no importa.
Puede colocar el valor como clave, significa que encontrará el valor instantáneamente. Mejor que usar la búsqueda en todos los elementos una y otra vez.
fuente
Una línea usando el
or
operador:fuente
puedes referir esta URL : para la función
Entonces la salida debería ser,
fuente
Otra idea para eliminar el valor de una matriz, use array_diff. Si yo quiero
(Doc: http://php.net/manual/fr/function.array-diff.php )
fuente
Creo que la forma más sencilla sería utilizar una función con un bucle foreach:
La salida será:
fuente
Con PHP 7.4 usando funciones de flecha:
Para mantenerlo en una matriz no asociativa, envuélvalo con
array_values()
:fuente