Как удалить результат `null` при использовании 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
]
];

Я хочу, чтобы уникальный массив по его значениям, поэтому я должен проверить следующее (из эта почта):

$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: Возможно, название не является точным, и пост может быть закрыт или помечен как дубликат, если это так, пожалуйста, предложите мне лучший заголовок или измените сами, если можете.

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

Другие решения

Этот код поможет вам избавиться от нуля:

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
По вопросам рекламы ammmcru@yandex.ru
Adblock
detector