Некоторые элементы в моем массиве – это пустые строки, основанные на том, что пользователь отправил. Мне нужно удалить эти элементы. У меня есть это:
foreach($linksArray as $link) { if($link == '') { unset($link); } } print_r($linksArray);
Но это не работает, у $linksArray
все еще есть пустые элементы. Я также пытался сделать это с помощью функции empty()
но результат тот же.
Поскольку вы имеете дело с массивом строк, вы можете просто использовать 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 !== ''; }));
Вы можете использовать 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
$myarray = array_filter($myarray, 'strlen'); //removes null values but leaves "0" $myarray = array_filter($myarray); //removes all null values
Самый популярный ответ на эту тему абсолютно НЕПРАВИЛЬНЫЙ.
Рассмотрим следующий скрипт PHP:
<?php $arr = array('1', '', '2', '3', '0'); // Incorrect: print_r(array_filter($arr)); // Correct: print_r(array_filter($arr, 'strlen'));
Почему это? Поскольку строка, содержащая один символ «0», также вычисляет значение boolean false, поэтому, хотя это не пустая строка, она все равно будет фильтроваться. Это было бы ошибкой.
Передача встроенной функции strlen, поскольку функция фильтрации будет работать, потому что она возвращает ненулевое целое для непустой строки и нулевое целое для пустой строки. Целочисленные числа без нуля всегда оцениваются как истинные при преобразовании в логические, тогда как нулевые целые числа всегда вычисляются как false при преобразовании в boolean.
Итак, абсолютный, окончательный, правильный ответ:
$arr = array_filter($arr, 'strlen');
Вы можете просто сделать
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())
Подводить итоги:
foreach($linksArray as $key => $link) { if($link === '') { unset($linksArray[$key]); } } print_r($linksArray);
с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)!=="";'));
Примечание. Этот код также удаляет нулевые и ложные элементы.
Самый проголосовавший ответ ошибочен или, по крайней мере, не совсем прав, поскольку OP говорит только о пустых строках. Вот подробное объяснение:
Прежде всего, мы должны договориться о том, какие пустые средства. Вы хотите отфильтровать:
$element === false
) empty()
PHP? Чтобы отфильтровать только пустые строки :
$filtered = array_diff($originalArray, array(""));
Чтобы только отфильтровать строго ложные значения, вы должны использовать функцию обратного вызова :
$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);
Я использую следующий скрипт для удаления пустых элементов из массива
for ($i=0; $i<$count($Array); $i++) { if (empty($Array[$i])) unset($Array[$i]); }
$a = array(1, '', '', '', 2, '', 3, 4); $b = array_values(array_filter($a)); print_r($b)
Если вы работаете с числовым массивом и вам нужно повторно проиндексировать массив после удаления пустых элементов, используйте функцию array_values :
array_values(array_filter($array));
См. Также: PHP reindex array?
Я должен был сделать это, чтобы сохранить значение массива (string) 0
$url = array_filter($data, function ($value) { return (!empty($value) || $value === 0 || $value==='0'); });
Для многомерного массива
$data = array_map('array_filter', $data); $data = array_filter($data);
$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; }
с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 );
Это мой предложенный код:
$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" }