it-swarm.com.ru

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

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

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

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

675
Will

Поскольку вы имеете дело с массивом строк, вы можете просто использовать array_filter() , что удобно для вас:

print_r(array_filter($linksArray));

Имейте в виду, что , если обратный вызов не предоставлен, все записи массива, равные FALSE (см. преобразование в логическое значение ), будут удалены. Поэтому, если вам нужно сохранить элементы, которые являются точной строкой '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 !== ''; }));
1345
BoltClock

Вы можете использовать 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);
152
Andrew Moore
$linksArray = array_filter($linksArray);

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

93
tamasd

Самый популярный ответ на эту тему абсолютно НЕПРАВИЛЬНЫЙ.

Рассмотрим следующий скрипт 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 при преобразовании в логическое значение, в то время как нулевые целые всегда оцениваются в false при преобразовании в логическое значение.

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

$arr = array_filter($arr, 'strlen');
90
Ron Cemer
    $myarray = array_filter($myarray, 'strlen');  //removes null values but leaves "0"
    $myarray = array_filter($myarray);            //removes all null values
51
matija kancijan

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

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 и ''
39
helpse
foreach($linksArray as $key => $link) 
{ 
    if($link === '') 
    { 
        unset($linksArray[$key]); 
    } 
} 
print_r($linksArray); 
28
Mark Baker

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

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

Примечание. Этот код намеренно содержит нулевые, 0 и ложные элементы.


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

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

Примечание. Этот код также удаляет нулевые и ложные элементы.

22
marcovtwout

Короче:

Это мой предложенный код:

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

Объяснение:

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

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

array_map для обрезки, array_filter для удаления пустых значений, strlen для сохранения значения 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

13
Nabi K.A.Z.

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

array_values(array_filter($array));

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

10
mulquin

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

Что означает empty?

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

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

Как вы отфильтровываете значения

Отфильтровать только пустые строки :

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

Чтобы отфильтровывать только строго falseзначения, вы должны использовать функцию callback:

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

Обратный вызов также полезен для любой комбинации, в которой вы хотите отфильтровать значения "falsey", кроме некоторых. (Например, фильтруйте каждые null и false и т.д., Оставляя только 0):

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

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

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

print_r($b)
8
user2511140

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

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

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

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

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

$url = array_filter($data, function ($value) {
  return (!empty($value) || $value === 0 || $value==='0');
});
7
Matt
$out_array = array_filter($input_array, function($item) 
{ 
    return !empty($item['key_of_array_to_check_whether_it_is_empty']); 
}
);
6
Naitik Shah
function trim_array($Array)
{
    foreach ($Array as $value) {
        if(trim($value) === '') {
            $index = array_search($value, $Array);
            unset($Array[$index]);
        }
    }
    return $Array;
}
6
ali Farmani
foreach($arr as $key => $val){
   if (empty($val)) unset($arr[$key];
}
5
mak ashtekar

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

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

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

Комбинация array_filter и array_slice делает свое дело.

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

Не знаю, как это сделать, так как это работает.

5
Chrisdigital

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

$array_without_empty_values = array_filter($array);
4
Matt
$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

4
Naitik Shah

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

$linksArray = array_filter($linksArray);
print_r($linksArray);
4
Ankit Gupta

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

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);

оно работает!

2
iBet7o

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

$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
    );
0
Ashish pathak

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

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

print_r($new_arr);
0
Shahrukh Anwar