动态取消设置空白数组项

时间:2010-02-23 10:37:28

标签: php drupal-6

我有一个正在构建的数组:

$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未设置但由于某种原因它不起作用。任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:3)

您可以使用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)

答案 1 :(得分:0)

我知道你想这样做:

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

输出:

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

如果没有回调传递给array_filter,它只返回未评估为false的值。值将被类型化,因此0为false,''null也是如此。请记住,preg_split生成的数组可能包含控制字符。如果结果数组var_dumps不是上面给出的,请尝试将preg_split中的模式更改为'/'.PHP_EOL.'/'

Alson请注意,出于性能原因,您要么使用带有标记的单preg_split(在另一个答案中给出),要么使用array_valuesarray_filterexplode。使用array_valuesarray_filterpreg_split的速度比其他两种替代方案慢两倍,后者大致相同。


$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