У меня есть следующий многомерный массив:
$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
]
];
Я хочу, чтобы уникальный массив по его значениям, поэтому я должен проверить следующее (из эта почта):
$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
значения в массиве, потому что их не должно быть. Итак, я попробовал этот другой обходной путь (нашел здесь):
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 null !== $var;
Результатом является массив с null
ценности.
PS: Возможно, название не является точным, и пост может быть закрыт или помечен как дубликат, если это так, пожалуйста, предложите мне лучший заголовок или измените сами, если можете.
Не уверен, почему у вас есть весь этот код. Эта строка получает уникальный массив:
$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));
Этот код поможет вам избавиться от нуля:
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» можно пропустить