Удаление пустых элементов массива
некоторые элементы в мой массив являются пустыми строками на основе того, что пользователь представил. Мне нужно удалить эти элементы. У меня есть это:
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())To подведем итог:
- 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!=="";'));Примечание: этот код намеренно сохраняет нулевые, 0 и ложные элементы.
или, может быть, вы хотите сначала обрезать элементы массива:
$array = array_filter($array, create_function('$a','return trim($a)!=="";'));Примечание: этот код также удаляет null и false элементы.
Если вы работаете с числовым массивом и необходимо повторно индексировать массив после удаления пустых элементов, используйте array_values функция:
array_values(array_filter($array));Смотрите также: PHP reindex массив?
самый проголосовавший ответ неправильно или, по крайней мере, не совсем верно, поскольку OP говорит только о пустых строках. Вот подробное объяснение:
Что значит пустой в смысле?
прежде всего, мы должны договориться о том, что пустой средства. Вы хотите отфильтровать:
- the пустые строки только ("")?
- the строго ложного значения? (
$element === false)- the falsey значения? (т. е. 0, 0.0, "", "0", NULL, array ()...)
- эквивалент PHP
Я использую следующий скрипт для удаления пустых элементов из массива
for ($i=0; $i<$count($Array); $i++) { if (empty($Array[$i])) unset($Array[$i]); }
Я должен был сделать это для того, чтобы сохранить значение массива (строки) 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это для keep0значением, и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" }Онлайн-Тест:
$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; }
использовать
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);
Comments