Освободите элементы пустого массива на лету

У меня есть массив, который строится с использованием:

$features_data[$i] = preg_split("/\n/", $row); 

Вывод выглядит следующим образом:

 Array ( [0] => Array ( [0] => [1] => [2] => <img src="http://example.com/sites/test/files/imagecache/feature-image/testimage_0.jpg" alt="" title="" class="imagecache imagecache-feature-image imagecache-default imagecache-feature-image_default" width="654" height="260" /> [3] => [4] => [5] => [6] => Test 1 [7] => [8] => [9] => [10] => Lorem ipsum dolor sit... [11] => [12] => ) [1] => Array ( [0] => [1] => [2] => [3] => [4] => [5] => [6] => Test 2 [7] => [8] => [9] => [10] => Aenean id tellus nec... [11] => [12] => ) [2] => Array ( [0] => [1] => [2] => [3] => [4] => [5] => [6] => Test 3 [7] => [8] => [9] => [10] => Maecenas ut pharetra... [11] => [12] => ) ) 

Я хотел бы избавиться от пустых элементов массива, а затем сбросить счетчик массива. Я пробовал использовать php unset, но по какой-то причине он не работает. Любая помощь будет принята с благодарностью.

Вы можете использовать array_filter() но вы действительно хотите использовать PREG_SPLIT_NO_EMPTY .

 preg_split("/\n/", $row, -1, PREG_SPLIT_NO_EMPTY) 

Изменить: конечно, это полностью зависит от вашего результата. Вероятно, ваш шаблон должен быть чем-то вроде этого

 preg_split("/[\\n\\r \\t]+/", $row, -1, PREG_SPLIT_NO_EMPTY) 

или это

 preg_split("/[\\n\\r \\t]*\\n[\\n\\r \\t]*/", $row, -1, PREG_SPLIT_NO_EMPTY) 

Я понимаю, что вы хотите сделать это:

 $array = array(null, null, 'Test', null, null); $output = array_values(array_filter($array)); var_dump($output); 

выходы:

 array(1) { [0]=> string(4) "Test" } 

Когда обратный вызов не передается array_filter , он возвращает только значения, не array_filter false. Значения будут присваиваться, поэтому 0 является ложным, как и '' или null . Имейте в виду, что результирующий массив из вашего preg_split может содержать контрольные символы. Если результирующий массив var_dumps не указан выше, попробуйте изменить шаблон в preg_split на '/'.PHP_EOL.'/' .

Alson отмечает, что вы либо хотите использовать одиночный preg_split с флагами (как указано в другом ответе), либо array_values plus array_filter плюс explode по соображениям производительности. Использование array_values plus array_filter plus 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