[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Рекурсивный array_filter
Bercut
Имеем многомерный массив. Вложенность массива произвольная. Элементами массива могут являться объекты типа stdClass. Элементами объектов могут быть массивы и другие объекты.
Необходимо удалить все пустые элементы из массива и вложенных объектов.

Не придумал ничего лучше этого:

function removeEmpty(&$arr)
{
if(is_object($arr))
{
foreach($arr as $i => $v)
{
if($v !== 0 && $v !== '0' && empty($v))
{
unset($arr->$i);
}
else if(is_array($v))
{
$arr->$i = array_filter($arr->$i, 'removeEmpty');
if(empty($arr->$i))
{
unset($arr->$i);
}
}

else if(is_object($v))
{
$arr->$i = array_filter((array)$arr->$i, 'removeEmpty');
if(empty($arr->$i))
{
unset($arr->$i);
}
else
{
$arr->$i = (object)$arr->$i;
}
}
}

$i = false;
foreach($arr as $tmp){$i=true;break;}
return $i;
}
else if(is_array($arr))
{
$arr = array_filter($arr, 'removeEmpty');
return !empty($arr);
}
else
{
return $arr !== 0 && $arr !== '0' && empty($arr) ? false : true;
}
}

$data = array_filter($data, 'removeEmpty');

Возможно есть более производительное / элегантное решение для PHP 5.2?



Спустя 2 минуты, 34 секунды (4.04.2011 - 11:39) alex12060 написал(а):
array_map()

Спустя 17 минут, 31 секунда (4.04.2011 - 11:57) Bercut написал(а):
array_map не подходит. Я увижу пустой элемент, но не смогу убрать его из массива, т.к. мне не известен индекс.

array_walk_recursive так же не подходит. Я увижу индекс и пустое значение, но не известно к чему этот индекс принадлежит.

Спустя 4 часа, 43 минуты, 39 секунд (4.04.2011 - 16:40) Bercut написал(а):
Указанный выше вариант не прокатит при конструкциях вида
$data = array(
(
object)array(
(
object)array()
)
);

есть другой способ, но он работает в 2,5 раза медленнее
function removeEmpty(&$arr)
{
$isObj = false;
$isEmpty = false;

if(is_object($arr))
{
$isObj = true;
$arr = (array)$arr;
}

if(is_array($arr))
{
$arr = array_filter($arr, 'removeEmpty');
$isEmpty = empty($arr);
if($isObj)
{
$arr = (object)$arr;
}
return !$isEmpty;
}
else
{
return $arr !== 0 && $arr !== '0' && empty($arr) ? false : true;
}
}

$data = array_filter($data, 'removeEmpty');
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.