Необходимо удалить все пустые элементы из массива и вложенных объектов.
Не придумал ничего лучше этого:
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 так же не подходит. Я увижу индекс и пустое значение, но не известно к чему этот индекс принадлежит.
array_walk_recursive так же не подходит. Я увижу индекс и пустое значение, но не известно к чему этот индекс принадлежит.
Спустя 4 часа, 43 минуты, 39 секунд (4.04.2011 - 16:40) Bercut написал(а):
Указанный выше вариант не прокатит при конструкциях вида
есть другой способ, но он работает в 2,5 раза медленнее
$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');