Сбросить пустые элементы массива на лету - PullRequest
0 голосов
/ 23 февраля 2010

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

$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, но по какой-то причине он не работает. Любая помощь будет принята с благодарностью.

Ответы [ 2 ]

3 голосов
/ 23 февраля 2010

Вы можете использовать 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)
0 голосов
/ 23 февраля 2010

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

$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
...