2013-05-14 14 views
6

ho questa matrice:PHP: rimuovere stringhe array vuoto nella matrice multidimensionale

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

'formato leggendo un file csv e l'array ('', '') sono le righe vuote alla fine il file.

Come posso rimuoverli?

ho provato:

$aryMain = array_filter($aryMain); 

Ma non sta funzionando :(

Grazie mille

+2

Perché non basta saltare quelle righe vuote in il primo posto? –

risposta

17

Per aggiungere alla risposta di Rikesh:

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

?> 

Attaccando il suo codice in un altro array_filter sarà sbarazzarsi di tutto stesse matrici.

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

) 

Rispetto:

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

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

    [1] => Array 
     (
     ) 

    [2] => Array 
     (
     ) 

) 
+0

@MiguelMas Tieni presente che anche stringhe come ''0'' verranno rimosse in questo modo. –

9

Usa array_map con array_filter,

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

O semplicemente! creare una funzione 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.

Nota: che questo rimuovere elementi comprendenti '0' (cioè stringa con un numero zero). Basta passare 'strlen' come secondo parametro per mantenere 0

+1

In aumento a causa di strlen tip! – MarkokraM

2

Applicare array_filter() sulla matrice principale e quindi ancora una volta sugli elementi interni:

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

L'interno array_filter() utilizza specificamente strlen() per determinare se l'elemento è vuoto; altrimenti rimuoverà anche '0'.

Per determinare il vuoto di un array è possibile utilizzare anche array_reduce():

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

Se questo è più efficiente è discutibile, ma dovrebbe risparmiare un po 'di memoria :)

Problemi correlati