2013-05-14 3 views
6

У меня есть этот массив:PHP: удалить пустые строки массива в многомерном массиве

$aryMain = array(array('hello','bye'), array('',''),array('','')); 

Он формируется путем чтения файла CSV и массива («», «») являются пустыми строками в конце файл.

Как его удалить?

Я пробовал:

$aryMain = array_filter($aryMain); 

Но он не работает :(

Большое спасибо

+2

Почему бы не просто пропустить эти пустые строки первое место? –

ответ

17

Чтобы добавить ответ Rikesh в:

<?php 
$aryMain = array(array('hello','bye'), array('',''),array('','')); 
$aryMain = array_filter(array_map('array_filter', $aryMain)); 
print_r($aryMain); 

?> 

Вставлять свой код в другой array_filter избавится от самих целых массивов.

Array 
(
    [0] => Array 
     (
      [0] => hello 
      [1] => bye 
     ) 

) 

По сравнению с:

$aryMain = array_map('array_filter', $aryMain); 

Array 
(
    [0] => Array 
     (
      [0] => hello 
      [1] => bye 
     ) 

    [1] => Array 
     (
     ) 

    [2] => Array 
     (
     ) 

) 
+0

@MiguelMas Имейте в виду, что такие строки, как ''0' ', также будут удалены. –

9

Использование array_map вместе с array_filter,

$array = array_filter(array_map('array_filter', $array)); 

Или просто! создать функцию array_filter_recursive

function array_filter_recursive($input) 
{ 
    foreach ($input as &$value) 
    { 
     if (is_array($value)) 
     { 
     $value = array_filter_recursive($value); 
     } 
    }  
    return array_filter($input); 
} 

DEMO.

Примечание: что это будет удалить элементы, содержащие '0' (т.е. строка с нулевой цифрой). Просто передайте 'strlen' в качестве второго параметра, чтобы сохранить 0

+1

Упрощенный из-за strlen tip! – MarkokraM

2

Применить array_filter() на главном массиве, а затем еще раз на внутренних элементах:

$aryMain = array_filter($aryMain, function($item) { 
    return array_filter($item, 'strlen'); 
}); 

Внутренний array_filter() специфически использует strlen(), чтобы определить, является ли элемент пусто; иначе он удалит '0'.

Для определения пустоты массива можно также использовать array_reduce():

array_filter($aryMain, function($item) { 
    return array_reduce($item, function(&$res, $item) { 
     return $res + strlen($item); 
    }, 0); 
}); 

ли это более эффективным является спорным, но он должен сохранить некоторую память :)

Смежные вопросы