PHP从对象中删除空项

10 浏览
0 Comments

PHP从对象中删除空项

我有以下对象,这里以数组的形式打印出来。这个对象是从一个SOAP请求构建而来的。

我想要做的是删除所有的空元素,并返回这个对象。

0
0 Comments

问题的原因是需要从一个对象中删除所有的空项(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中从对象中删除空项的问题的原因和解决方法。

0
0 Comments

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。

现在,代码提供了一个与示例提供的精确副本,除了示例中的一个不一致之外。如果有些东西不完全符合您的要求,您可以进一步修改代码。

0
0 Comments

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。为了解决这个问题,在判断是否为空时,需要添加额外的条件判断。

最终的输出结果是一个不包含空项的数组。

0