2016-10-26 3 views
0

Je le tableau multidimensionnel suivant:Comment supprimer le résultat `null` lors de l'utilisation de array_unique?

$subregion = [ 
    [ 
     "subregion_id" => "8", 
     "subregion_name" => "NORTH_AMERICA", 
     "subregion_abbr" => "US" 
    ], 
    [ 
     "subregion_id" => "9", 
     "subregion_name" => "NORTH_AMERICA", 
     "subregion_abbr" => "CA" 
    ], 
    [ 
     "subregion_id" => "6", 
     "subregion_name" => "WE", 
     "subregion_abbr" => "South" 
    ], 
    [ 
     "subregion_id" => "0", 
     "subregion_name" => null, 
     "subregion_abbr" => null 
    ], 
    [ 
     "subregion_id" => "5", 
     "subregion_name" => "WE", 
     "subregion_abbr" => "North" 
    ], 
    [ 
     "subregion_id" => "0", 
     "subregion_name" => null, 
     "subregion_abbr" => null 
    ] 
]; 

Je veux unique tableau par ses valeurs et je dois donc tester les éléments suivants (de this post):

$subregion = array_map("unserialize", array_unique(array_map("serialize", $subregion))); 
$subregion = array_intersect_key($subregion, array_unique(array_map('serialize', $subregion))); 
$subregion_unique = array_unique($subregion, SORT_REGULAR); 

Tous travaillent (essayé un par un) et produit la même sortie:

$subregion = [ 
    [ 
     "subregion_id" => "8", 
     "subregion_name" => "NORTH_AMERICA", 
     "subregion_abbr" => "US" 
    ], 
    [ 
     "subregion_id" => "9", 
     "subregion_name" => "NORTH_AMERICA", 
     "subregion_abbr" => "CA" 
    ], 
    [ 
     "subregion_id" => "6", 
     "subregion_name" => "WE", 
     "subregion_abbr" => "South" 
    ], 
    [ 
     "subregion_id" => "5", 
     "subregion_name" => "WE", 
     "subregion_abbr" => "North" 
    ], 
    [ 
     "subregion_id" => "0", 
     "subregion_name" => null, 
     "subregion_abbr" => null 
    ] 
]; 

Je veux me débarrasser des null valeurs sur l'ar ray parce qu'ils ne devraient pas être là. J'ai donc essayé cette autre solution de contournement (found here):

private function is_not_null($var) 
{ 
    return !is_null($var); 
} 

$unique = array_filter($subregion_unique, 'is_not_null'); 

Mais surprendre la sortie de $unique est exactement la même que précédemment, pourquoi? Qu'est-ce qui me manque ici?

NOTE j'ai oublié de mentionner que devrait être compatible avec PHP 5.3.10+

Mise à jour: test1

suivant les instructions de @abracadaver ce que j'ai essayé:

$unique = array_map('unserialize', array_unique(array_map('serialize', $subregion))); 
$unique = array_map(function($v) { return array_filter($v, 'is_not_null'); }, $unique); 

J'ai changé la fonction is_not_null($var) ci-dessus pour retourner le résultat de cette façon:

return null !== $var; 

Le résultat est un tableau avec des valeurs null. PS: Peut-être que le titre n'est pas précis et que le post est tenté d'être fermé ou marqué comme doublon, si oui, veuillez me suggérer un meilleur titre ou changer vous-même si vous le pouvez.

+0

'subregion_unique' de $ est? Quoi qu'il en soit, le problème est que vous n'accédez pas correctement à votre tableau '2-Dimensional' dans la fonction' is_not_null' – Aaron

+0

@Aaron la dernière ligne de mon test '$ subregion_unique = array_unique ($ subregion, SORT_REGULAR);' – ReynierPM

+0

à http://stackoverflow.com/questions/27447923/how-to-filter-a-two-dimensional-array-by-value – Aaron

Répondre

1

Vous ne savez pas pourquoi vous avez tout ce code.Celui-ci ligne obtient une gamme unique:

$unique = array_map("unserialize", array_unique(array_map("serialize", $subregion))); 

Puis filtrer le null avec votre fonction actuelle:

$unique = array_map(function($v) { return array_filter($v, 'is_not_null'); }, $unique); 

Si vous ne vous inquiétez pas si le 0 est enlevé, il est encore plus courte et vous ne pas besoin de votre fonction:

$unique = array_map(function($v) { return array_filter($v); }, $unique); 

Ensuite, vous savez que vous aurez un tableau vide de l'enfant, de sorte que vous pouvez filtrer:

$unique = array_filter($unique); 

Le SORT_REGULAR ne fait aucune différence, mais quand il peut, ou si vous avez besoin d'un autre drapeau, vous serait tout simplement l'ajouter dans le array_unique() ci-dessus:

$unique = array_map("unserialize", 
        array_unique(array_map("serialize", $subregion), SORT_REGULAR)); 
+0

Peu importe .... – JOUM

+0

Vérifiez ma ** Mise à jour: test1 ** dans OP, ne fonctionne pas pour moi. – ReynierPM

+0

Probablement besoin d'une nouvelle question, il fonctionne évidemment https://3v4l.org/dQkaE – AbraCadaver

0

Ce code vous aidera à se débarrasser de l'hypothèse nulle:

foreach($subregion_unique as $key => $item) { 
    foreach($item as $itemKey => $value) { 
     if($value === null) { 
      unset($subregion_unique[$key][$itemKey]; 
     } 
    } 
} 
0

php> = 5.3 l'utiliser de cette manière

$unique = array_map(function($a){ 
       return array_filter($a); 
       },$subregion); 

pour filtrer chaque sous-tableau

ou tout simplement

foreach($subregion as &$a){ 
    $a=array_filter($a); 
} 

si le "subregion_id" = "0" peut être ignoré

+0

Supprime également '" 0 "'. – AbraCadaver

+0

@AbraCadaver Bon point, mais l'entrée avec '" 0 "' n'a pas de valeur, donc il peut être retiré. Ou est Id = 0 un vrai ID;) – JOUM

+0

Dunno. Sur la base de la clé 'subregion_id', j'ai supposé que cela pourrait être important. – AbraCadaver