2012-04-18 25 views
10

Ho cercato un sacco di risposte, ma nessuno di loro lavora per me.Come rimuovere i valori vuoti dall'array multidimensionale in PHP?

Questi sono i dati assegnati alla mia $quantities array:

Array(
    [10] => Array([25.00] => 1) 
    [9] => Array([30.00] => 3) 
    [8] => Array([30.00] => 4) 
    [12] => Array([35.00] =>) 
    [1] => Array([30.00] =>) 
    [2] => Array([30.00] =>) 
) 

Sto cercando un modo per rimuovere i sottoarray con valori vuoti come [12][1] e [2] mantenendo tutto il resto.

Il risultato desiderato:

Array(
    [10] => Array([25.00] => 1) 
    [9] => Array([30.00] => 3) 
    [8] => Array([30.00] => 4) 
) 

ho provato un sacco di funzioni la documentazione ufficiale di PHP e nessuno di loro ha lavorato.

Ho usato questo uno:

function array_filter_recursive($array, $callback = null) { 
    foreach ($array as $key => & $value) { 
     if (is_array($value)) { 
      $value = array_filter_recursive($value, $callback); 
     } else { 
      if (! is_null($callback)) { 
       if (! $callback($value)) { 
        unset($array[$key]); 
       } 
      } else { 
       if (! (bool) $value) { 
        unset($array[$key]); 
       } 
      } 
     } 
    } 
    unset($value); 
    return $array; 
} 

ma rimuove solo l'elemento nei sottoarray; Ho bisogno che i sottoarray vengano rimossi completamente.

Non voglio questo:

Array(
    [10] => Array([25.00] => 1) 
    [9] => Array([30.00] => 3) 
    [8] => Array([30.00] => 4) 
    [12] => Array() 
    [1] => Array() 
    [2] => Array() 
) 
+0

Considerare l'utilizzo di var_dump() per mostrarci i contenuti dell'array. –

+0

Per una pagina che viene utilizzata come destinazione per così tanti collegamenti dupli, questa pagina ha una quantità incredibile di risposte errate con aumento di frequenza. @ Richard-MX Ho postato una risposta che non usa ricorsione o più funzioni di iterazione in modo che i lettori che vengono trasferiti qui siano in grado di vedere una soluzione snella (a prova zero). (non è chiaro nel tuo post se i tuoi array vuoti hanno stringhe vuote o 'null' come valori, quindi ho provato con entrambi) – mickmackusa

risposta

12

Bit in ritardo, ma può aiutare qualcuno che cerca la stessa risposta. Ho usato questo approccio molto semplice a;

  1. rimuovere tutte le chiavi da matrici nidificate che contengono nessun valore, allora
  2. rimuovere tutti gli array nidificati vuoti.

$postArr = array_map('array_filter', $postArr); 
$postArr = array_filter($postArr); 
2

Non so se questo è esattamente ciò che il vostro ricerca.

function array_remove_null($array) { 
    foreach ($array as $key => $value) 
    { 
     if(is_null($value)) 
      unset($array[$key]); 
     if(is_array($value)) 
      $array[$key] = array_remove_null($value); 
    } 
    return $array; 
} 

aggiornamento (correzioni):

function array_remove_null($array) { 
    foreach ($array as $key => $value) 
    { 
     if(is_null($value)) 
      unset($array[$key]); 
     if(is_string($value) && empty($value)) 
      unset($array[$key]); 
     if(is_array($value)) 
      $array[$key] = array_remove_null($value); 
     if(isset($array[$key]) && count($array[$key])==0) 
      unset($array[$key]); 
    } 
    return $array; 
} 

sono sicuro che una migliore verifica e rendendo questo più robusto potrebbe aiutare la soluzione.

+0

Ciao Jason, grazie per la tua risposta. Sfortunatamente, non funziona per quello di cui ho bisogno.Mentre Paolo risponde, restituisce lo stesso della domanda originale. –

+0

Non sono sicuro del motivo per cui questo ha 4 upvotes. Questa risposta al solo codice non funziona. [Demo] (http://sandbox.onlinephpfunctions.com/code/a06f86d99043713158cb6170b516ffebd9533f4a) – mickmackusa

+0

@mickmackusa questo esempio ha funzionato ai tempi di PHP 5. –

1

uso array_map() per il filtro ogni matrice in $ array:

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

Ecco demo

+0

Questa risposta NON FUNZIONA. Non funziona nel link demo pubblicato. Non funziona in [my demo link] (http://sandbox.onlinephpfunctions.com/code/e8b7659f6b504afea691451351c039de24c0a7f4) Come mai nel mondo questo ha guadagnato 3 upvotes? Lasciati andare da me. – mickmackusa

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

Questa sintassi è un lavoro e molto aiuto ragazzi di ringraziamento pieno ..

+0

Questo è un metodo duplicato esatto (carattere per carattere) della risposta di NaitikShah che è stata pubblicata due mesi prima. Se non riesci a migliorare la tua risposta per fornire informazioni migliori dovresti eliminare questa risposta perché non aggiunge valore alla pagina (è semplicemente una pagina gonfia). – mickmackusa

+0

Questa risposta NON FUNZIONA. Non funziona in [my demo link] (http://sandbox.onlinephpfunctions.com/code/e8b7659f6b504afea691451351c039de24c0a7f4) Come mai nel mondo questo ha guadagnato 3 upvotes? Lasciati andare da me. – mickmackusa

5

La seguente funzione ha funzionato per il mio caso.Possiamo usare una semplice funzione ricorsiva per rimuovere tutti gli elementi vuoti dalla multidimensionale array PHP:

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

Quindi basta solo chiamare questa funzione:

$myArray = array_filter_recursive($myArray); 
1

Uso array_filter con array_map come di seguito:

$arr=array_filter(array_map('array_filter', $arr)); 
+0

Questa non è una nuova informazione. Questo è un duplicato di [AlastairF's answer] (https://stackoverflow.com/a/18796083/2943403) scritto come one-liner. – mickmackusa

-1

Rimuove tutti gli elementi con valori null in modo ricorsivo su array multideminsional. Funziona su PHP> = 5.6. Se si desidera rimuovere tutti i valori "empry", sostituire !is_null($value) con !empty($value).

function recursivelyRemoveItemsWithNullValuesFromArray(array $data = []): array 
{ 
    $data = array_map(function($value) { 
     return is_array($value) ? recursivelyRemoveItemsWithNullValuesFromArray($value) : $value; 
    }, $data); 

    return array_filter($data, function($value) { 
     return !is_null($value); 
    }); 
} 
+0

Questa risposta non fornisce l'output desiderato dell'OP. [Demo] (http://sandbox.onlinephpfunctions.com/code/c30daafe3cf0959e0a0c4dcaa901244605a8f7d9) – mickmackusa

-2

Poiché i sottoarray nella propria matrice hanno un solo elemento di ciascuno, è possibile semplificare l'approccio utilizzando uno dei due metodi descritti di seguito. Il vantaggio logico consiste nell'evitare l'iteratore funzionale (array_filter) sugli elementi di secondo livello. Questo è il motivo per cui current() è più adatto a questa domanda/pagina.

Codice: (Demo)

$quantities=[ 
    10=>['25.00'=>1], 
    9=>['30.00'=>3], 
    8=>['30.00'=>4], 
    12=>['35.00'=>null], 
    1=>['30.00'=>''], 
    2=>['30.00'=>null] 
]; 

var_export(array_filter($quantities,function($a){return strlen(current($a));})); 

O

foreach($quantities as $key=>$sub){ // could be done "by reference" but that impacts code stability 
    if(!strlen(current($sub))){ // if subarray value has no length 
     unset($quantities[$key]); 
    } 
} 
var_export($quantities); 

Sia uscita lo stesso risultato (che rimuove volutamente valori vuoti e conserva 0 valori)

array (
    10 => 
    array (
    '25.00' => 1, 
), 
    9 => 
    array (
    '30.00' => 3, 
), 
    8 => 
    array (
    '30.00' => 4, 
), 
) 

In precedenza metodi, strlen() viene utilizzato per controllare th e Elementi di secondo livello perché l'OP elencava solo gli interi come valori "non vuoti". Futuro SO lettori possono avere requisiti diversi basati sugli elementi eventualmente che tiene false, null, '0', 0, ecc funzioni adatto per strlen() può essere: qualsiasi the "is_" functions, empty(), qualsiasi the "ctype" functions, e molti altri.

Se l'array di secondo livello dell'OP contiene più di un elemento E l'OP voleva rimuovere tutti gli elementi zero-ish, falso-y, vuoto, nullo (ovvero gli zeri non sono ricercati o non si verificheranno), quindi Alastair F's answer essere la scelta migliore

Se l'array di input dell'OP aveva un numero sconosciuto di livelli E gli elementi zero-ish/false-y/empty/null devono essere rimossi, quindi Reza Mamun's answer è un approccio logico e ricorsivo.

Il mio punto di essere (e la mia motivazione dietro spendere così tanto tempo e cura per rispondere a questa domanda) che array_filter() è avido e se non si è a conoscenza di questo comportamento predefinito, il progetto può silenziosamente restituire informazioni errate. Spero che questa spiegazione consenta ai programmatori di risparmiare tempo e conflitti.

Problemi correlati