Я так понимаю, вы хотите сделать это:
$array = array(null, null, 'Test', null, null);
$output = array_values(array_filter($array));
var_dump($output);
выходы:
array(1) {
[0]=>
string(4) "Test"
}
Когда обратный вызов не передается array_filter
, он будет возвращать только значения, не оцениваемые как ложные. Значения будут типизированы, поэтому 0
равно false, как ''
или null
. Имейте в виду, что полученный массив из вашего preg_split
может содержать контрольные символы. Если полученный массив var_dumps не соответствует указанному выше, попробуйте изменить шаблон в preg_split
на '/'.PHP_EOL.'/'
.
Элсон отмечает, что вы либо хотите использовать один preg_split
с флагами (как указано в другом ответе), либо array_values
плюс array_filter
плюс explode
по соображениям производительности. Использование array_values
плюс array_filter
плюс preg_split
в 2 раза медленнее, чем любая из двух других альтернатив, которые приблизительно выполняют ту же функцию.
$str = <<< TXT
Test
Foo
Bar
TXT;
Тестирование с
$start = microtime(true);
for($i=0; $i<100000; $i++) {
array_values(array_filter(explode(PHP_EOL, $str)));
}
echo microtime(true) - $start, PHP_EOL; // 0.60249495506287
$start = microtime(true);
for($i=0; $i<100000; $i++) {
array_values(array_filter(preg_split("/".PHP_EOL."/", $str)));
}
echo microtime(true) - $start, PHP_EOL; // 1.0394451618195
$start = microtime(true);
for($i=0; $i<100000; $i++) {
preg_split("/".PHP_EOL."/", $str, -1, PREG_SPLIT_NO_EMPTY);
}
echo microtime(true) - $start, PHP_EOL; // 0.60252904891968