2010-02-23 2 views
0

У меня есть массив, который строится с помощью:UNSET пустые элементы массива на лету

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

ответ

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

+0

@digital, может быть, вы на окнах, а ваш linebreak не '\ n'? Попробуйте ''/'. PHP_EOL.'/''Для шаблона. – Gordon

+0

или вы можете разделить с помощью '/ \ r | \ n /'? Затем оба конца строки должны работать, и PREG_SPLIT_NO_EMPTY удалит все, что осталось. –

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_values плюс 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 
Смежные вопросы