У меня есть массив, который строится с использованием:
$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