2016-06-28 4 views
1

Я работаю над функцией фильтрации массива, чтобы отфильтровать свой массив и удалить весь объект типа DateTime. Мой код работал нормально на php5.6, но в php7 я получаю другой результат. Я не уверен, почему или что изменилось в 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) { } } 

он отлично работает путем удаления всех объектов из type DateTime bu т, если я запускаю код в 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, чтобы вызвать это поведение и лучший способ исправить его.

+2

[*** Предупреждение ** Если массив изменен из функции обратного вызова (например, элемент добавлен, удален или отключен), поведение этой функции не определено. *] (Http://php.net/manual/ о/function.array-filter.php # refsect1-function.array фильтр-нота) – Rizier123

ответ

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); 

Поскольку эта функция будет изменять свой входной массив, вы должны сделать копию массива перед использованием этой функции на ней, если вы по-прежнему нуждается в его первоначальном виде.

 Смежные вопросы

  • Нет связанных вопросов^_^