我正在使用数组过滤器函数来过滤我的数组并删除所有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中改变了什么导致这种行为和最好的修复方法它
答案 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);
因为这个函数会修改它的输入数组,所以你应该先使用这个函数复制你的数组,如果你仍然需要它的原始形式。