使用 array_unique 时如何删除“null”结果?

How to remove `null` result when using 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
    ]
];

我想通过它的值来唯一化该数组,所以我测试了以下内容(来自 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);

所有这些都有效(一一尝试)并产生相同的输出:

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

我想删除数组中的 null 值,因为它们不应该存在。所以我尝试了其他解决方法 (found here):

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

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

但是惊喜的是$unique的输出和之前的一模一样,为什么?我在这里缺少什么?

注意 我忘了说应该兼容 PHP 5.3.10+

更新: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);

我已经将上面的函数 is_not_null($var) 更改为 return 结果是这样的:

return null !== $var;

结果是一个包含 null 个值的数组。

PS:可能标题不准确,post容易被关闭或标记为重复,如果是请建议我更好的标题或自己更改。

此代码将帮助您摆脱空值:

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

php >=5.3 这样使用

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

过滤每个子数组

或者只是

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

如果 "subregion_id"="0" 可以跳过

不确定为什么你有那么多代码。这一行得到一个唯一的数组:

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

然后用你当前的函数过滤掉null

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