Некоторые элементы в моем массиве - это пустые строки, основанные на том, что пользователь отправил. Мне нужно удалить эти элементы. У меня есть это:
foreach($linksArray as $link)
{
if($link == '')
{
unset($link);
}
}
print_r($linksArray);
Но это не сработает, $linksArray
все еще имеет пустые элементы. Я также пытался сделать это с помощью функции empty()
, но результат тот же.
Поскольку вы имеете дело с массивом строк, вы можете просто использовать 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 !== ''; }));
empty
над == ''
. Но спасибо за ссылку :)
Вы можете использовать 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;
}
РЕДАКТИРОВАТЬ: Возможно, ваши элементы не пустые как таковые, но содержат одно или несколько пробелов... Вы можете использовать следующее, прежде чем использовать array_filter
$trimmedArray = array_map('trim', $linksArray);
scalar
элементы, да. В противном случае вы не можете сделать это.
$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 script:
<?php
$arr = array('1', '', '2', '3', '0');
// Incorrect:
print_r(array_filter($arr));
// Correct:
print_r(array_filter($arr, 'strlen'));
Почему это? Поскольку строка, содержащая единственный символ "0", также вычисляет значение boolean false, поэтому, хотя это не пустая строка, она все равно будет отфильтрована. Это будет ошибкой.
Передача встроенной функции strlen, поскольку функция фильтрации будет работать, потому что она возвращает ненулевое целое для непустой строки и нулевое целое для пустой строки. Не нулевые целые числа всегда оценивают значение true при преобразовании в boolean, тогда как нулевые целые числа всегда вычисляются как 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);
false
и 0
. Учитывая, что это было опубликовано в ту же минуту, что и принятый ответ (это небезопасно и неверно), я могу только предположить, что ваши 8 голосов проголосовали по сравнению с принятым ответом 649, а последний - решение в одну строку.
array_filter()
будет более подходящим, чем цикл foreach()
Еще один лайнер для удаления пустых ( "пустых строк" ) элементов из вашего массива.
$array = array_filter($array, create_function('$a','return $a!=="";'));
Примечание. Этот код преднамеренно содержит нулевые, 0 и ложные элементы.
Или, возможно, вы хотите сначала обрезать элементы массива:
$array = array_filter($array, create_function('$a','return trim($a)!=="";'));
Примечание. Этот код также удаляет нулевые и ложные элементы.
Самый проголосовавший ответ ошибочен или, по крайней мере, не совсем прав, поскольку OP говорит только о пустых строках. Вот подробное объяснение:
Прежде всего, мы должны договориться о том, какие пустые средства. Вы хотите отфильтровать:
$element === false
)empty()
?Чтобы отфильтровать только пустые строки:
$filtered = array_diff($originalArray, array(""));
Чтобы отфильтровать только значения строго false, вы должны использовать функцию обратного вызова:
$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);
null
и false
, но оставить 0, вы можете также использовать PHP встроенный в strlen
функции в качестве обратного вызова.
Если вы работаете с числовым массивом и вам нужно повторно проиндексировать массив после удаления пустых элементов, используйте array_values :
array_values(array_filter($array));
Также смотрите: массив reindex PHP?
$a = array(1, '', '', '', 2, '', 3, 4);
$b = array_values(array_filter($a));
print_r($b)
Я использую следующий script для удаления пустых элементов из массива
for ($i=0; $i<$count($Array); $i++)
{
if (empty($Array[$i])) unset($Array[$i]);
}
Мне пришлось сделать это, чтобы сохранить значение массива (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);
Отсутствует представление об эффективности или контрольных показателях, но оно работает.
$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
Только одна строка: Обновление (спасибо @suther):
$array_without_empty_values = array_filter($array);
используйте array_filter
функцию для удаления пустых значений:
$linksArray = array_filter($linksArray);
print_r($linksArray);
foreach($arr as $key => $val){
if (empty($val)) unset($arr[$key];
}
function trim_array($Array)
{
foreach ($Array as $value)
if (trim($value) == "")
{
$index = array_search($value, $Array);
unset($Array[$index]);
}
return $Array;
}
Удалить пустые элементы массива
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);
¡он работает!
Это мой предложенный код:
$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"
}
попробуйте это ** ** Пример
$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
);