Pregunta Eliminar elementos de matriz vacíos


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 he intentado hacerlo con el empty() función, pero el resultado es el mismo.


618
2017-09-06 21:06


origen


Respuestas:


Como se trata de una variedad de cadenas, simplemente puede usar array_filter(), que maneja todo esto de manera conveniente para usted:

print_r(array_filter($linksArray));

Manten eso en mente si no se proporciona una devolución de llamada, todas las entradas de array son iguales a FALSE (ver convirtiendo a booleano) será eliminado. Entonces, si necesita conservar elementos que son, por ejemplo, una cadena exacta '0', necesitarás una devolución de llamada personalizada:

// PHP < 5.3
print_r(array_filter($linksArray, create_function('$value', 'return $value !== "";')));

// PHP 5.3 and later
print_r(array_filter($linksArray, function($value) { return $value !== ''; }));

1219
2017-09-06 21:10



Puedes usar array_filter para eliminar elementos vacíos:

$emptyRemoved = array_filter($linksArray);

Si usted tiene (int) 0 en su matriz, puede usar lo siguiente:

$emptyRemoved = remove_empty($linksArray);

function remove_empty($array) {
  return array_filter($array, '_remove_empty_internal');
}

function _remove_empty_internal($value) {
  return !empty($value) || $value === 0;
}

EDITAR: Quizás sus elementos no estén vacíos per se pero contengan uno o más espacios ... Puede usar lo siguiente antes de usar array_filter

$trimmedArray = array_map('trim', $linksArray);

143
2017-09-06 21:14



$linksArray = array_filter($linksArray);

"Si no se proporciona una devolución de llamada, se eliminarán todas las entradas de entrada igual a FALSO". - http://php.net/manual/en/function.array-filter.php


85
2017-09-06 21:14



La respuesta más popular sobre este tema es absolutamente INCORRECTA.

Considere el siguiente script PHP:

<?php
$arr = array('1', '', '2', '3', '0');
// Incorrect:
print_r(array_filter($arr));
// Correct:
print_r(array_filter($arr, 'strlen'));

¿Por qué es esto? Debido a que una cadena que contiene un solo carácter '0' también evalúa a booleano falso, por lo tanto, aunque no es una cadena vacía, se filtrará. Eso sería un error.

Pasar la función strlen incorporada como la función de filtrado funcionará, porque 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 a booleanos, mientras que los enteros cero siempre los evalúan como falsos cuando se convierten a booleanos.

Entonces, la respuesta absoluta, definitiva y correcta es:

$arr = array_filter($arr, 'strlen');

71
2018-06-28 16:30



    $myarray = array_filter($myarray, 'strlen');  //removes null values but leaves "0"
    $myarray = array_filter($myarray);            //removes all null values

49
2018-04-22 15:12



Puedes simplemente hacer

array_filter($array)

array_filter: "Si no se proporciona devolución de llamada, se eliminarán todas las entradas de entrada igual a FALSE". Esto significa que los elementos con valores NULL, 0, '0', '', FALSE, array () se eliminarán también.

La otra opción es hacer

array_diff($array, array(''))

que eliminará elementos con valores NULL, '' y FALSE.

Espero que esto ayude :)

ACTUALIZAR

Aquí hay un ejemplo.

$a = array(0, '0', NULL, FALSE, '', array());

var_dump(array_filter($a));
// array()

var_dump(array_diff($a, array(0))) // 0 / '0'
// array(NULL, FALSE, '', array());

var_dump(array_diff($a, array(NULL))) // NULL / FALSE / ''
// array(0, '0', array())

Para resumir:

  • 0 o '0' eliminará 0 y '0'
  • NULL, FALSE o '' eliminará NULL, FALSE y ''

38
2017-11-26 15:35



foreach($linksArray as $key => $link) 
{ 
    if($link === '') 
    { 
        unset($linksArray[$key]); 
    } 
} 
print_r($linksArray); 

28
2017-09-06 21:10



Otro revestimiento para eliminar los elementos vacíos ("" cadena vacía) de su matriz.

$array = array_filter($array, create_function('$a','return $a!=="";'));

Nota: Este código mantiene deliberadamente nulo, 0 y elementos falsos.


O tal vez quieras recortar tus elementos de matriz primero:

$array = array_filter($array, create_function('$a','return trim($a)!=="";'));

Nota: Este código también elimina elementos nulos y falsos.


22
2018-02-28 16:46



La respuesta más votada es incorrecto o al menos no completamente cierto ya que el OP está hablando solo de cadenas en blanco. Aquí hay una explicación completa:

Que hace vacío ¿media?

En primer lugar, debemos acordar qué vacío medio. ¿Quiere filtrar?

  1. el cadenas vacías solamente ("")?
  2. el estrictamente falso¿valores? ($element === false)
  3. el falsey ¿valores? (es decir, 0, 0.0, "", "0", NULL, matriz () ...)
  4. el equivalente de PHP empty() ¿función?

¿Cómo filtra los valores?

Para filtrar solo cadenas vacías:

$filtered = array_diff($originalArray, array(""));

Para filtrar solo estrictamente falso valores, debe usar un llamar de vuelta función:

$filtered = array_diff($originalArray, 'myCallback');
function myCallback($var) {
    return $var === false;
}

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, filtra cada null y false, etc., dejando solo 0)

$filtered = array_filter($originalArray, 'myCallback');
function myCallback($var) {
    return ($var === 0 || $var === '0');
}

El tercer y cuarto caso son (para nuestros fines al fin) equivalentes, y para eso todo lo que tiene que usar es el predeterminado:

$filtered = array_filter($originalArray);

9
2017-12-10 13:36



$a = array(1, '', '', '', 2, '', 3, 4);
$b = array_values(array_filter($a));

print_r($b)

8
2017-10-22 21:14