2010-02-23 52 views
0

我有一個正在使用內置的數組:未設置空白數組項

$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未設置,但由於某種原因,它不工作。任何幫助將不勝感激。

回答

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) 
+0

感謝,子陣列項目現在下降到9項,但仍存在空白這是真的奇。 – digital 2010-02-23 10:45:04

+0

@數字可能是你在窗戶上,你的換行符不是'\ n'?嘗試使用''/'。PHP_EOL。'/''模式。 – Gordon 2010-02-23 11:09:45

+0

或者你可以使用'/ \ r | \ n /'分割?然後兩個行結束符都可以工作,並且PREG_SPLIT_NO_EMPTY將刪除剩下的任何東西 – 2010-02-23 12:35:42

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是錯誤的,因爲''null。請記住,從preg_split得到的數組可能包含控制字符。如果結果數組var_dumps不是上面給出的,請嘗試將preg_split中的模式更改爲'/'.PHP_EOL.'/'

ALSON注意,你要麼要使用的單preg_split用標誌(如在另一個答案中給出)或array_valuesarray_filterexplode出於性能的考慮。使用array_valuesarray_filterpreg_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