Удалить пустые элементы массива

некоторые элементы в моем массиве являются пустыми строками на основе того, что пользователь отправил. Мне нужно удалить эти элементы. У меня вот что:

foreach($linksArray as $link)
{
    if($link == '')
    {
        unset($link);
    }
}
print_r($linksArray);

но это не работает,$linksArray все еще имеет пустые элементы. Я также попытался сделать это с помощью

25 ответов


как вы имеете дело с массивом строк, вы можете просто использовать array_filter(), который легко обрабатывает все это для вас:

print_r(array_filter($linksArray));

имейте в виду, что если обратный вызов поступает, все элементы массива равны FALSE (см. преобразование в boolean) будут удалены. Поэтому, если вам нужно сохранить элементы, то есть точную строку '0', вам понадобится пользовательский обратный вызов:

// 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 !== ''; }));

можно использовать array_filter удалить пустые элементы:

$emptyRemoved = array_filter($linksArray);

если у вас (int) 0 в вашем массиве, вы можете использовать следующее:

$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;
}

EDIT: возможно, ваши элементы не пусты сами по себе, но содержат одно или несколько пробелов... Перед использованием array_filter

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

$linksArray = array_filter($linksArray);

" если обратный вызов не указан, все входные данные, равные FALSE, будут удалены."-- http://php.net/manual/en/function.array-filter.php


самый популярный ответ на эту тему абсолютно неверен.

рассмотрим следующий PHP-скрипт:

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

почему это? Поскольку строка, содержащая один символ "0", также оценивается как логическое значение false, поэтому, даже если это не пустая строка, она все равно будет фильтроваться. Это было бы ошибкой.

передача встроенной функции strlen в качестве функции фильтрации будет работать, поскольку она возвращает ненулевое целое число для непустой строки и нулевое целое число для пустой строки. Ненулевых целых чисел всегда возвращать true при преобразовании в boolean, А нуль целых возвращают false при преобразовании в boolean.

Итак, абсолютный, окончательный, правильный ответ:

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

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

вы можете просто сделать

array_filter($array)

array_filter: "если обратный вызов не указан, все входные данные, равные FALSE, будут удалены."Это означает, что элементы со значениями NULL, 0, '0',", FALSE, array() также будут удалены.

другой вариант делает

array_diff($array, array(''))

который удалит элементы со значениями NULL, " и FALSE.

надеюсь, что это помогает :)

обновление

вот пример.

$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())

В подведем итог:

  • 0 или ' 0 'удалит 0 и'0'
  • NULL, FALSE или "удалит NULL, FALSE и"

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

еще одна строка для удаления пустых (""пустая строка) элементов из массива.

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

Примечание: этот код намеренно сохраняет null, 0 и false элементы.


или, может быть, вы хотите сначала обрезать элементы массива:

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

Примечание: этот код также удаляет null и false элементы.


Если вы работаете с числовым массивом и вам нужно повторно индексировать массив после удаления пустых элементов, используйте array_values функция:

array_values(array_filter($array));

Смотрите также: массив переиндексации PHP?


наиболее проголосовали ответ неправильно или, по крайней мере, не совсем верно, поскольку OP говорит только о пустых строках. Вот подробное объяснение:

Что значит пустой в смысле?

прежде всего, мы должны договориться о том, что пустой средства. Вы хотите отфильтровать:

  1. the пустые строки только ("")?
  2. the строго ложного значения? ($element === false)
  3. the falsey значения? (т. е. 0, 0.0, "", "0", NULL, array()...)
  4. эквивалент PHP

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

print_r($b)

Я использую следующий скрипт для удаления пустых элементов из массива

for ($i=0; $i<$count($Array); $i++)
  {
    if (empty($Array[$i])) unset($Array[$i]);
  }

для многомерного массива

$data = array_map('array_filter', $data);
$data = array_filter($data);

Я должен был сделать это, чтобы сохранить значение массива (string) 0

$url = array_filter($data, function ($value) {
  return (!empty($value) || $value === 0 || $value==='0');
});

короче:

это мой предлагаемый код:

$myarray =  array_values(array_filter(array_map('trim', $myarray), 'strlen'));

объяснение:

Я думаю использовать array_filter хорошо, но недостаточно, потому что значения похожи на space и \n,... держите в массиве, и это обычно плохо.

поэтому я предлагаю вам использовать смесь array_filter и array_map.

array_map для подравнивания, array_filter для удаления пустых значений,strlen для keep 0 значением, и array_values для повторного индексирования, если ты нуждался.

примеры:

$myarray = array("\r", "\n", "\r\n", "", " ", "0", "a");

// "\r", "\n", "\r\n", " ", "a"
$new1 = array_filter($myarray);

// "a"
$new2 = array_filter(array_map('trim', $myarray));

// "0", "a"
$new3 = array_filter(array_map('trim', $myarray), 'strlen');

// "0", "a" (reindex)
$new4 = array_values(array_filter(array_map('trim', $myarray), 'strlen'));

var_dump($new1, $new2, $new3, $new4);

результаты:

array(5) {
  [0]=>
" string(1) "
  [1]=>
  string(1) "
"
  [2]=>
  string(2) "
"
  [4]=>
  string(1) " "
  [6]=>
  string(1) "a"
}
array(1) {
  [6]=>
  string(1) "a"
}
array(2) {
  [5]=>
  string(1) "0"
  [6]=>
  string(1) "a"
}
array(2) {
  [0]=>
  string(1) "0"
  [1]=>
  string(1) "a"
}

Онлайн-Тест:

http://phpio.net/s/5yg0


$out_array = array_filter($input_array, function($item) 
{ 
    return !empty($item['key_of_array_to_check_whether_it_is_empty']); 
}
);

просто хочу внести альтернативу петель...также устранение пробелов в ключах...

в моем случае я хотел сохранить последовательные ключи массива, когда операция была завершена (а не только нечетные числа, на которые я смотрел. Настройка кода для поиска только нечетных ключей казалась мне хрупкой и не дружественной к будущему.)

Я искал что-то более похожее на это: http://gotofritz.net/blog/howto/removing-empty-array-elements-php/

комбинация array_filter и array_slice делает трюк.

$example = array_filter($example); $example = array_slice($example,0);

нет идеи об эффективности или критериях, но она работает.


function trim_array($Array)
{
    foreach ($Array as $value) {
        if(trim($value) === '') {
            $index = array_search($value, $Array);
            unset($Array[$index]);
        }
    }
    return $Array;
}

foreach($arr as $key => $val){
   if (empty($val)) unset($arr[$key];
}

использовать array_filter функция для удаления пустых значений:

$linksArray = array_filter($linksArray);
print_r($linksArray);

только одна строка : Обновление (благодаря @suther):

$array_without_empty_values = array_filter($array);

$my = ("0"=>" ","1"=>"5","2"=>"6","3"=>" ");   

foreach ($my as $key => $value) {
    if (is_null($value)) unset($my[$key]);
}

foreach ($my as $key => $value) {
    echo   $key . ':' . $value . '<br>';
} 

выход

1:5

2:6


удалить пустые элементы массива

function removeEmptyElements(&$element)
{
    if (is_array($element)) {
        if ($key = key($element)) {
            $element[$key] = array_filter($element);
        }

        if (count($element) != count($element, COUNT_RECURSIVE)) {
            $element = array_filter(current($element), __FUNCTION__);
        }

        return $element;
    } else {
        return empty($element) ? false : $element;
    }
}

$data = array(
    'horarios' => array(),
    'grupos' => array(
        '1A' => array(
            'Juan' => array(
                'calificaciones' => array(
                    'Matematicas' => 8,
                    'Español' => 5,
                    'Ingles' => 9,
                ),
                'asistencias' => array(
                    'enero' => 20,
                    'febrero' => 10,
                    'marzo' => '',
                )
            ),
            'Damian' => array(
                'calificaciones' => array(
                    'Matematicas' => 10,
                    'Español' => '',
                    'Ingles' => 9,
                ),
                'asistencias' => array(
                    'enero' => 20,
                    'febrero' => '',
                    'marzo' => 5,
                )
            ),
        ),
        '1B' => array(
            'Mariana' => array(
                'calificaciones' => array(
                    'Matematicas' => null,
                    'Español' => 7,
                    'Ingles' => 9,
                ),
                'asistencias' => array(
                    'enero' => null,
                    'febrero' => 5,
                    'marzo' => 5,
                )
            ),
        ),
    )
);

$data = array_filter($data, 'removeEmptyElements');
var_dump($data);

¡это работает!


попробуйте это ** ** Пример

$or = array(
        'PersonalInformation.first_name' => $this->request->data['User']['first_name'],
        'PersonalInformation.last_name' => $this->request->data['User']['last_name'],
        'PersonalInformation.primary_phone' => $this->request->data['User']['primary_phone'],
        'PersonalInformation.dob' => $this->request->data['User']['dob'],
        'User.email' => $this->request->data['User']['email'],
    );



 $or = array_filter($or);

    $condition = array(
        'User.role' => array('U', 'P'),
        'User.user_status' => array('active', 'lead', 'inactive'),
        'OR' => $or
    );

согласно вашему методу, вы можете просто поймать эти элементы в другом массиве и использовать его следующим образом,

foreach($linksArray as $link){
   if(!empty($link)){
      $new_arr[] = $link
   }
}

print_r($new_arr);