PHP从对象中删除空项
问题的原因是需要从一个对象中删除所有的空项(null变量),但是仅仅删除null变量是不够的,还需要删除包含null变量的所有元素。解决方法是将对象转换为数组并使用递归循环来检查和删除空项。
以下是一个不使用递归的示例,仅仅删除对象中的null变量:
class A { public $var = "aVar"; public $var1 = null; } $a = new A(); var_dump($a); $array = (array)$a; foreach($array as $key => $value) { if (is_null($value)){ unset($array[$key]); } } var_dump($array);
如果要处理多维数组,就需要使用递归。正如之前提到的,我已经在尝试中使用过类似的方法。
以上是解决PHP中从对象中删除空项的问题的原因和解决方法。
PHP Removing empty items from object
在对这段代码进行一番思考后,我想出了一个递归函数的方法,就像我之前建议的那样,将对象转换为数组以检查变量是否设置为null。
如果该对象内的所有变量都为null,则将父对象索引设置为null,以将对象的引用设置为null。
我尽力解释并记录了代码。
请不要只是复制代码然后完成,而是仔细阅读并尝试从我提供的代码中学习。
/**
Unsets all empty variables in $object
*/
function loopTrough(&$object, &$parent = null, $key = null, $objectIsArray = false, $parentIsArray = false)
{
// 跟踪变量和null变量的数量
$vars = 0;
$null = 0;
foreach($object as $index => $value)
{
$vars = $vars + 1;
// 还要检查是否为数组
$isArray = is_array($value);
// 检查是否为对象
if (is_object($value) || $isArray) // using value here is save
{
// 遍历我们找到的新对象(或数组)
if ($objectIsArray)
{
loopTrough($object[$index], $object, $index, $isArray, $objectIsArray);
}
else
{
loopTrough($object->{$index}, $object, $index, $isArray, $objectIsArray);
}
}
// 检查是否为null
if ($objectIsArray)
{
if (!isset($object[$index]) || $object[$index] == ""){
$null = $null + 1;
// 我们不想显示null
unset($object[$index]);
}
}
else
{
if (!isset($object->{$index}) || $object->{$index} == "") // use $object->{index} here, and not $value because $value does not change when object reference is changed
{
$null = $null + 1;
// 我们不想显示null
unset($object->{$index});
}
}
}
// 如果null变量和变量一样多
if ($vars == $null && $parent !== null && $key !== null)
{
// 将父引用设置为null
if ($parentIsArray) // Example exludes arrays, uncomment this if you want values in arrays to be recurisvely set to null
{
// unset($parent[$key]);
}
else
{
unset($parent->{$key});
}
}
}
class Test
{
public $one;
public $two;
}
$test = new Test();
$test->one = new Test();
$test->one->two = "On";
$test->two = new Test();
$test->two->one = new Test();
var_dump($test);
loopTrough($test);
var_dump($test);
仍然没有起作用,使用我上面发布的JSON格式的对象。
我已经修改了代码以支持数组。这使得代码变得更杂乱,但它能够工作。
嗯,即使通过这段代码运行后并没有移除所有的null对象。显然,它只将值设置为null。
现在,代码提供了一个与示例提供的精确副本,除了示例中的一个不一致之外。如果有些东西不完全符合您的要求,您可以进一步修改代码。
PHP Removing empty items from object
在这个问题中,需求是递归扫描嵌套数组,删除空的分支/项。这是另一个“树遍历”的例子。唯一的“棘手”部分是让树上层的处理知道是否将当前项添加到输出树中。处理节点的函数将返回一个数组,其中包含一个“保持值”标志以及要保留的值。
代码中的processList函数是一个递归函数,用于处理列表。首先,它创建了一个名为$listResult的关联数组,包含一个名为'keepValue'的标志和一个名为'value'的空数组。然后,它遍历列表中的每个项。如果当前项为null,则跳过。如果当前项是标量值,则判断是否需要保留该值。如果值不为空或不为空格,则将'keepValue'标志设置为true,并将值添加到$listResult数组中。如果当前项是数组,则递归调用processList函数处理该数组,并将返回的结果存储在$itemResult变量中。如果$itemResult的'keepValue'标志为true,则将'keepValue'标志设置为true,并将$itemResult的'value'添加到$listResult数组中。最后,函数返回$listResult数组。
运行该函数的示例代码是通过将JSON数据解码为数组,并将数组传递给processList函数。然后,打印出$result数组的'value'部分,即删除了空项的数组。
解决此问题的关键是在遍历列表并处理每个项时,使用条件语句判断是否保留该项的值。这样可以递归地处理嵌套的数组,并删除空的分支/项。
代码中还提到了一个问题,即empty()函数会删除字符串文字“0”和数字0。为了解决这个问题,在判断是否为空时,需要添加额外的条件判断。
最终的输出结果是一个不包含空项的数组。