php7上的数组过滤器

时间:2016-06-28 17:48:39

标签: php php-7 php-5.6

我正在使用数组过滤器函数来过滤我的数组并删除所有DateTime类型的对象我的代码在php5.6上运行正常但在php7中我得到了不同的结果我不知道为什么或者什么在php7中更改并修复它的最佳方法

这里是代码示例

$array1 = ['one', 'two', 'three', new DateTime(), [new DateTime(), new DateTime(), new DateTime()]];

$array2 = ['one', 'two', 'three', ['four', 'five', 'six']];

$data = array_filter($array1, $callback = function (&$value) use (&$callback) {
    if (is_array($value)) {
        $value = array_filter($value, $callback);
    }

    return ! $value instanceof DateTime;
});

如果我在php5.6中运行此代码,我会得到

array(4) { [0]=> string(3) "one" [1]=> string(3) "two" [2]=> string(5) "three" [4]=> array(0) { } }

通过删除DateTime类型的所有对象它可以正常工作但如果我在php7中运行代码我得到

array(4) { [0]=> string(3) "one" [1]=> string(3) "two" [2]=> string(5) "three" [4]=> array(3) { [0]=> object(DateTime)#2 (3) { ["date"]=> string(26) "2016-06-27 18:53:11.000000" ["timezone_type"]=> int(3) ["timezone"]=> string(11) "Asia/Riyadh" } [1]=> object(DateTime)#3 (3) { ["date"]=> string(26) "2016-06-27 18:53:11.000000" ["timezone_type"]=> int(3) ["timezone"]=> string(11) "Asia/Riyadh" } [2]=> object(DateTime)#4 (3) { ["date"]=> string(26) "2016-06-27 18:53:11.000000" ["timezone_type"]=> int(3) ["timezone"]=> string(11) "Asia/Riyadh" } } }

你可以看到它只从第一级数组中删除了DateTime类型的对象并忽略了第二级数组而没有过滤它们请你帮我理解php7中改变了什么导致这种行为和最好的修复方法它

1 个答案:

答案 0 :(得分:0)

在这种情况下,使用递归函数删除DateTime对象而不是array_filter可能更简单。

$array1 = ['one', 'two', 'three', new DateTime(), 
              [new DateTime(), new DateTime(), new DateTime()]];

function removeDateTimes(&$x) {
    foreach ($x as $k => &$v) {
        if ($v instanceof DateTime) unset($x[$k]);
        elseif (is_array($v)) removeDateTimes($v);
    }
}

removeDateTimes($array1);

因为这个函数会修改它的输入数组,所以你应该先使用这个函数复制你的数组,如果你仍然需要它的原始形式。