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. $linksArrayTodaví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_filterDebe 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/…falseelementos. ( php.net/manual/en/function.array-filter.php )ala segunda vez simplemente restablece la primera.Puede usar
array_filterpara eliminar elementos vacíos:Si tiene
(int) 0en 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_filterfuente
scalarelementos 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
falsey0. 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,0yfalseelementos.O tal vez desee recortar los elementos de su matriz primero:
Nota: Este código también elimina elementos
nullyfalseelementos.fuente
En breve:
Este es mi código sugerido:
Explicación:
Creo que el uso
array_filteres bueno, pero no suficiente, porque los valores son comospacey\n... se mantienen en la matriz y esto generalmente es malo.Así que le sugiero que utilice mezcla
array_filteryarray_map.array_mapes para recortar,array_filteres para eliminar valores vacíos,strlenes para mantener el0valor yarray_valueses 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
nullyfalse, 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
nullyfalsedejar 0, también puede utilizar la función incorporada de phpstrlencomo 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_filterfunció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
Falseque 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()eliminaNULLo 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_filtercuando 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 unforeachbucle.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