使用 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));
我有以下多维数组:
$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));