Algunos elementos en mi matriz son cadenas vacías basadas en lo que el usuario ha enviado. Necesito eliminar esos elementos. Tengo esto:
foreach($linksArray as $link)
{
if($link == '')
{
unset($link);
}
}
print_r($linksArray);
Pero no funciona. $linksArray
Todavía tiene elementos vacíos. También intenté hacerlo con la empty()
función, pero el resultado es el mismo.
Respuestas:
Como se trata de una serie de cadenas, simplemente puede usar
array_filter()
, que maneja convenientemente todo esto por usted:Tenga en cuenta que si no se proporciona una devolución de llamada , se eliminarán todas las entradas de la matriz igual a
FALSE
(consulte la conversión a booleana ). Entonces, si necesita preservar elementos que son, por ejemplo, una cadena exacta'0'
, necesitará una devolución de llamada personalizada:fuente
array_filter
Debe eliminar los elementos vacíos. Y si la definición de vacío de PHP no es la misma que su definición, entonces puede completar la opción de devolución de llamada con una función anónima que arroja elementos no deseados. Aparentemente debe tener php 5.3 o posterior para usar devoluciones de llamadas anónimas. stackoverflow.com/questions/2412299/…false
elementos. ( php.net/manual/en/function.array-filter.php )a
la segunda vez simplemente restablece la primera.Puede usar
array_filter
para eliminar elementos vacíos:Si tiene
(int) 0
en su matriz, puede usar lo siguiente:EDITAR: Tal vez sus elementos no están vacíos per se pero contienen uno o más espacios ... Puede usar lo siguiente antes de usar
array_filter
fuente
scalar
elementos en su matriz, sí. De lo contrario, no puedes hacer eso.function remove_empty($array) { return array_filter($array, function($value){return !empty($value) || $value === 0;}); }
array_map()
hizo la magia porque tenía espacios en esas matrices vacías!La respuesta más popular sobre este tema es absolutamente INCORRECTA.
Considere el siguiente script PHP:
¿Por qué es esto? Debido a que una cadena que contiene un solo carácter '0' también se evalúa como falso booleano, por lo que, aunque no es una cadena vacía, aún se filtrará. Eso sería un error.
Pasar la función strlen incorporada como la función de filtrado funcionará, ya que devuelve un entero distinto de cero para una cadena no vacía y un entero cero para una cadena vacía. Los enteros distintos de cero siempre se evalúan como verdaderos cuando se convierten en booleanos, mientras que los enteros cero siempre se evalúan como falsos cuando se convierten en booleanos.
Entonces, la respuesta absoluta, definitiva y correcta es:
fuente
0
,""
,null
)strlen() expects parameter 1 to be string, array given
"Si no se proporciona devolución de llamada, se eliminarán todas las entradas de entrada iguales a FALSO". - http://php.net/manual/en/function.array-filter.php
fuente
fuente
Solo puedes hacer
array_filter: "Si no se proporciona devolución de llamada, se eliminarán todas las entradas de entrada iguales a FALSE". Esto significa que los elementos con valores NULL, 0, '0', '', FALSE, array () también se eliminarán.
La otra opción es hacer
que eliminará elementos con valores NULL '' y FALSE.
Espero que esto ayude :)
ACTUALIZAR
Aquí hay un ejemplo.
Para resumir:
fuente
fuente
false
y0
. Teniendo en cuenta que esto se publicó en el mismo minuto que la respuesta aceptada (que es insegura e incorrecta), solo puedo suponer que sus 8 votos positivos en comparación con los 649 de la respuesta aceptada se deben a que esta última es una solución de una línea.array_filter()
sería un enfoque más limpio que unforeach()
bucletrim()
, les recomendaríaif(is_string($link) && trim($link) === '')
Otro forro para eliminar elementos vacíos ("" cadenas vacías) de su matriz.
Nota: Este código se mantiene deliberadamente
null
,0
yfalse
elementos.O tal vez desee recortar los elementos de su matriz primero:
Nota: Este código también elimina elementos
null
yfalse
elementos.fuente
En breve:
Este es mi código sugerido:
Explicación:
Creo que el uso
array_filter
es bueno, pero no suficiente, porque los valores son comospace
y\n
... se mantienen en la matriz y esto generalmente es malo.Así que le sugiero que utilice mezcla
array_filter
yarray_map
.array_map
es para recortar,array_filter
es para eliminar valores vacíos,strlen
es para mantener el0
valor yarray_values
es para volver a indexar si es necesario.Muestras:
Resultados:
Prueba en línea:
http://phpio.net/s/5yg0
fuente
Si está trabajando con una matriz numérica y necesita volver a indexar la matriz después de eliminar elementos vacíos, use la función array_values :
Ver también: PHP reindex array?
fuente
La respuesta más votada es incorrecta o al menos no completamente cierta, ya que el OP solo habla de cadenas en blanco. Aquí hay una explicación detallada:
¿Qué significa vacío ?
En primer lugar, debemos acordar lo que significa vacío . ¿Te refieres a filtrar:
$element === false
)empty()
función de PHP ?¿Cómo se filtran los valores?
Para filtrar solo cadenas vacías :
Para filtrar solo valores estrictamente falsos , debe usar una función de devolución de llamada :
La devolución de llamada también es útil para cualquier combinación en la que desee filtrar los valores "falsey", excepto algunos. (Por ejemplo, filtre cada
null
yfalse
, etc., dejando solo0
):El tercer y cuarto caso son (para nuestros fines, por fin) equivalentes, y para eso todo lo que tiene que usar es el predeterminado:
fuente
null
yfalse
dejar 0, también puede utilizar la función incorporada de phpstrlen
como devolución de llamada.Tuve que hacer esto para mantener un valor de matriz de (cadena) 0
fuente
fuente
Para matriz multidimensional
fuente
fuente
fuente
Utilizo el siguiente script para eliminar elementos vacíos de una matriz
fuente
Solo quiero contribuir con una alternativa a los bucles ... también abordando las brechas en las claves ...
En mi caso, quería mantener las teclas de matriz secuenciales cuando se completaba la operación (no solo números impares, que es lo que estaba mirando. Configurar el código para buscar solo teclas impares me parecía frágil y no era adecuado para el futuro).
Estaba buscando algo más como esto: http://gotofritz.net/blog/howto/removing-empty-array-elements-php/
La combinación de array_filter y array_slice hace el truco.
$example = array_filter($example); $example = array_slice($example,0);
No tengo idea de eficiencias o puntos de referencia, pero funciona.
fuente
salida
fuente
fuente
Solo una línea: Actualización (gracias a @suther):
fuente
use la
array_filter
función para eliminar valores vacíos:fuente
Eliminar elementos de matriz vacíos
¡funciona!
fuente
Según su método, puede capturar esos elementos en otra matriz y usarlos de la siguiente manera,
fuente
prueba esto ** ** Ejemplo
fuente
Creo que array_walk es mucho más adecuado aquí
Salida:
También recortamos espacios vacíos de los valores válidos
Finalmente, solo (nulo), (Boolean False) y ('') se considerarán cadenas vacías
En cuanto a
False
que está bien eliminarlo, porque AFAIK el usuario no puede enviar valores booleanos.fuente
Con este tipo de cosas, es mucho mejor ser explícito sobre lo que quieres y lo que no quieres.
Ayudará al próximo tipo a no ser sorprendido por el comportamiento
array_filter()
sin una devolución de llamada. Por ejemplo, terminé con esta pregunta porque olvidé siarray_filter()
eliminaNULL
o no. Perdí el tiempo cuando podría haber usado la solución a continuación y obtuve mi respuesta.Además, la lógica es el lenguaje angnóstico en el sentido de que el código se puede copiar a otro idioma sin tener que entender el comportamiento de una función php como
array_filter
cuando no se pasa la devolución de llamada.En mi solución, es claro a simple vista lo que está sucediendo. Elimine un condicional para mantener algo o agregue una nueva condición para filtrar valores adicionales.
Haga caso omiso del uso real de,
array_filter()
ya que solo le estoy pasando una devolución de llamada personalizada; puede continuar y extraer eso para su propia función si lo desea. Solo lo estoy usando como azúcar para unforeach
bucle.Otro beneficio de este enfoque es que puede dividir los predicados de filtrado en una función abstracta que filtra un solo valor por matriz y construir una solución componible.
Vea este ejemplo y los comentarios en línea para la salida.
Ahora puede crear dinámicamente una función llamada
filterer()
usingpipe()
que aplicará estas funciones parcialmente aplicadas por usted.fuente