2016-10-26 3 views
0

私は、次の多次元配列があります。array_uniqueを使用しているときに `null`の結果を削除するには?

$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 
    ] 
]; 

私はユニークにその値によってその配列をしたいので、私は(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); 

それらのすべての作業(1を試してみましたが1)によると、同じ出力生成します。私は、ARにnull値を取り除きたい

$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 
    ] 
]; 

を彼らはそこにいてはならないからです。だから私は、この他の回避策(found here)を試してみました:

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

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

しかし$uniqueの出力を驚かは、なぜ、以前とまったく同じですか?私はここで何が欠けているのですか?これは私が試したものですtest1の

後@abracadaver命令:

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

NOTEは、私はPHPで5.3.10+

アップデート適合するものでなければならない言及するのを忘れてしまいました

私は、このように結果を返すために、上記の機能is_not_null($var)を変更しました:

return null !== $var; 

結果はnull値を持つ配列です。

PS:たぶんタイトルは正確ではなく、ポストを閉じたりすることができますので、もしご自分で私に優れたタイトルや変更を提案してください場合は、重複としてマークされるように誘惑されます。

+0

'$のsubregion_unique'がありますか?とにかく問題は、 'is_not_null'関数で' 2-Dimensional array'に正しくアクセスしていないことです。 – Aaron

+0

@Aaron my testの最後の行 '$ subregion_unique = array_unique($ subregion、SORT_REGULAR);' – ReynierPM

+0

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

答えて

1

ないあなたはすべてのそのコードを持っている理由を確認してくださいをスキップすることができます。あなたの現在の機能をnullをフィルタリングするためにその後

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

:この一行は、固有の配列を取得します

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

0が、それも短いですその後除去している場合は、あなたが気にしない場合あなたの機能を必要としない:

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

は、その後、あなたが空の子配列を持っているだろう知っているので、あなたはそれをフィルタリングすることができます。

$unique = array_filter($unique); 

SORT_REGULARはここに違いはありませんが、とき、それは月のあなたが別のフラグが必要な場合、または、あなただけ上記array_unique()でそれを追加します。

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

気にしないでください.... – JOUM

+0

OPの私の**アップデート:test1 **をチェックしてください、私のために働いていません。 – ReynierPM

+0

おそらく新しい質問が必要ですが、それは明らかにhttps://3v4l.org/dQkaEEで動作します – AbraCadaver

0

このコードは、ヌルをオフに取り除くのに役立ちます。

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

PHP> = 5.3 各サブアレイ

またはちょうど

をフィルタリングするために、このように

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

をそれを使用します

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

「subregion_idは、」=「0」

+0

'' 0 ''も削除します。 – AbraCadaver

+0

@AbraCadaver Good Pointですが、 '' 0 "'のエントリは値を持たないため、削除することができます。または、Id = 0実ID;) – JOUM

+0

Dunno。キー 'subregion_id'に基づいて、私はそれが重要かもしれないと仮定しました。 – AbraCadaver

関連する問題